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

标签 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 b ON b.number = a.number
JOIN Ctable c ON c.number = b.number
ORDER BY a.number

我的期望是这两个都将返回第一个查询所返回的结果。第一个查询返回 TableA 中的每一行;然而,出乎意料的是,第二行只返回 TableA 的结果,前提是它们也存在于 TableC 中。

为什么从 C 到 B 的连接在第二个查询中限制了 TableA 而在第一个查询中没有?

谢谢!

最佳答案

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

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 内部连接在外部连接内;嵌套改变结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25890476/

相关文章:

mysql - 基于另一个表的值加入 sql 查询(在一个查询中)

mysql - sql 不喜欢 "%term%"不工作

sql - 自连接与内部和外部连接查询

mysql - 内部联接以从行的总和中选择最大值

mysql - 在选择查询中使用 SQL 临时表

sql - Postgres 日期和提取周数 - 不一致的结果

sql - 创建 oracle 查询的问题

mysql - 根据最后一行过滤数据 mysql

ruby-on-rails - ActiveRecord #includes, with condition, but load all relations, 而不仅仅是那些匹配条件

mysql - 加入 4 个表,相互之间有很好的引用