这两个查询之间有什么区别吗?
查询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字段来连接表。
希望这是可以理解的。
提前致谢!
答案 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中的每个记录与表中的每个记录组合在一起) B) - 然后返回满足连接谓词的所有记录。
(这就是为什么带有WHERE的CROSS JOIN可以返回与INNER JOIN相同的结果 - ick,尽管!)
答案 1 :(得分:0)
内部联接意味着:对于左侧表中的每一行,返回右侧表中的所有匹配行。不要在右表中没有匹配的情况下返回行。
因此,加入新表可以减少和增加返回的行数: