Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL内部连接外部连接内部连接;嵌套会改变结果_Sql_Join_Inner Join_Outer Join - Fatal编程技术网

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)不同的原因是一样的,戈登。括号的位置有助于理解。在对查询处理顺序进行了一些研究之后,它的点击效果要好得多。谢谢你!