SQL内部连接外部连接内部连接;嵌套会改变结果
我有点惊讶,这两个查询给出了不同的结果: 第一个问题:SQL内部连接外部连接内部连接;嵌套会改变结果,sql,join,inner-join,outer-join,Sql,Join,Inner Join,Outer Join,我有点惊讶,这两个查询给出了不同的结果: 第一个问题: SELECT a.number, a.name , b.* FROM Atable a LEFT OUTER JOIN Btable b JOIN Ctable c ON c.number = b.number ON b.number = a.number ORDER BY a.number; 第二个问题: SELECT a.number, a.name , b.* FROM Atable a LEFT OUTER JOIN Btable
SELECT a.number, a.name , b.*
FROM Atable a
LEFT OUTER JOIN Btable b
JOIN Ctable c ON c.number = b.number
ON b.number = a.number
ORDER BY a.number;
第二个问题:
SELECT a.number, a.name , b.*
FROM Atable a
LEFT OUTER JOIN Btable b ON b.number = a.number
JOIN Ctable c ON c.number = b.number
ORDER BY a.number
我的期望是,这两个查询都将返回第一个查询所返回的结果。第一个查询返回TableA中的每一行;然而,出乎意料的是,第二行仅返回TableA中的结果(如果它们也存在于TableC中)
为什么从C到B的连接在第二个查询中限制了TableA,而在第一个查询中没有限制
谢谢 您的第一个查询,使用parens来说明如何解析它:
SELECT a.number, a.name , b.*
FROM Atable a LEFT OUTER JOIN
(Btable b JOIN
Ctable c
ON c.number = b.number
) ON b.number = a.number
ORDER BY a.number;
在一行中有两个on
子句会让人困惑,因此括号会有所帮助。这表明您保留了第一个表中的所有行
第二个问题是:
SELECT a.number, a.name , b.*
FROM (Atable a LEFT OUTER JOIN
Btable b
ON b.number = a.number
) JOIN
Ctable c
ON c.number = b.number
ORDER BY a.number;
您正在内部联接第一次联接的结果。因此,只有匹配的行才会进入结果集
在执行多个联接时,我建议对所有联接使用
left join
。混合使用内部连接和外部连接可能会导致混淆。这与(A+B)*C与A+(B*C)不同的原因是一样的,戈登。括号的位置有助于理解。在对查询处理顺序进行了一些研究之后,它的点击效果要好得多。谢谢你!