外连接内的 SQL 内连接;嵌套改变结果

Posted

技术标签:

【中文标题】外连接内的 SQL 内连接;嵌套改变结果【英文标题】:SQL Inner Joins inside Outer Joins; Nesting Alters Results 【发布时间】:2014-11-11 11:37:15 【问题描述】:

我有点惊讶这两个查询给出不同的结果:

第一个查询:

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 而在第一个查询中没有?

谢谢!

【问题讨论】:

同理(A + B)*C和A + (B*C)不同 【参考方案1】:

您的第一个查询,用括号阐明它是如何解析的:

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。混合使用内连接和外连接可能会导致混淆。

【讨论】:

谢谢,戈登。您放置括号有助于使其有意义。在对查询处理顺序进行了一些研究之后,它的点击要好得多。欣赏!

以上是关于外连接内的 SQL 内连接;嵌套改变结果的主要内容,如果未能解决你的问题,请参考以下文章

SQL内连接与外连接用法与区别

SQL内连接与外连接用法与区别

SQL连接查询研究

sql左连接 右连接 内连接 外连接都是啥

sql的四种连接——左外连接右外连接内连接全连接

MySQL数据库多表查询