两个查询之间的差异

时间:2013-05-13 19:51:07

标签: sql

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

查询1:

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字段来连接表。

希望这是可以理解的。

提前致谢!

2 个答案:

答案 0 :(得分:3)

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

如果第一个查询导致更多行,则tareas包含每个连接谓词的重复记录(即它具有重复的idclientecrm值)。这就是为什么记录必须与完全匹配同一结果集的原因。 (如果这是一个1-1的关系,那么一些约束没有正确设置..哎呀!)

考虑这个简单的inner join示例,显示具有不同多重性的结果:

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相同的结果 - ick,尽管!)

答案 1 :(得分:0)

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

因此,加入新表可以减少和增加返回的行数:

  • 减少因为新联接过滤掉没有匹配的行
  • 增加,因为新联接可以在左侧表中每行添加多行。如果多于一个右手行匹配左手行,则会发生这种情况。