0

这两个查询有什么区别吗?

查询一:

select a.idclientecrm from clientescrmporlistadeclientescrm a
inner join clientescrmporlistadeclientescrm b on (a.idclientecrm=b.idclientecrm and            a.idlistadeclientescrm = 58)
inner join tareas c on b.idclientecrm = c.idclientecrm
where b.idlistadeclientescrm = 70

查询 2:

select a.idclientecrm from clientescrmporlistadeclientescrm a
inner join clientescrmporlistadeclientescrm b on (a.idclientecrm=b.idclientecrm and   a.idlistadeclientescrm = 58)
where b.idlistadeclientescrm = 70

我知道第一个在“tareas”表上有额外的内部连接,但我不知道它会给我一个不同的结果。谁能告诉我为什么?

编辑:

我正在尝试加入此查询的结果:

select a.idclientecrm from clientescrmporlistadeclientescrm a
inner join clientescrmporlistadeclientescrm b on (a.idclientecrm=b.idclientecrm and   a.idlistadeclientescrm = 58)
where b.idlistadeclientescrm = 70

与另一个名为“tareas”的表一起使用,我只需要最大日期。每个 idclientecrm 可以有多个日期。“tareas”表具有用于连接表的 idclientecrm 字段。

希望可以理解。

提前致谢!

4

2 回答 2

3

查询具有相同结果的唯一方法是,如果tareas连接匹配每条记录(在前面的 from..inner 连接集中)恰好一次

如果第一个查询产生更多行,则tareas每个连接谓词包含重复记录(即它具有重复idclientecrm值)。这就是为什么对于相同的结果集,记录必须只匹配一次。(如果这是一个 1-1 的关系,那么一些约束设置不正确.. 哎呀!)

考虑这个简单的内部连接示例,显示具有不同多重性的结果:

A <- { 1, 2, 4 }
B <- { 1, 2(#1), 2(#2), 3 }

A join B => { 1, 2(#1), 2(#2) }

结果原因:

  • A.1 匹配 B.1 - 这是唯一匹配一次的记录
  • A.2 匹配 B.2(#1)
  • A.2 匹配 B.2(#2)
  • A.4 不匹配
  • B.3 不匹配

我认为维基百科的这段摘录很好地解释了这个概念:

连接的结果可以定义为首先取表中所有记录的笛卡尔积(或交叉连接)的结果(将表 A 中的每条记录与表 B 中的每条记录结合起来)——然后返回所有满足加入谓词

(这就是为什么带有 WHERE 的 CROSS JOIN 可以返回与 INNER JOIN 相同的结果的原因 - 很糟糕!)

于 2013-05-13T19:59:21.280 回答
0

内连接意味着:对于左侧表中的每一行,返回右侧表中所有匹配的行。不要返回右侧表中没有匹配的行。

所以加入一个新表可以减少和增加返回的行数:

  • 减少因为新连接过滤掉了没有匹配的行
  • 增加是因为新联接可以在左侧表中的每行添加多于一行。如果多个右侧行与左侧行匹配,则会发生这种情况。
于 2013-05-13T20:01:18.833 回答