sql - 在任何 OUTER JOIN 之后使用 INNER JOIN 是否真的会使 OUTER JOIN 的效果无效?

标签 sql join inner-join outer-join

换句话说,对于嵌套/多个 JOIN SQL 语句,是否应该始终首先使用 INNER JOIN(要么将其放在顶部行或通过使用括号首先 INNER JOIN 两个表)并确保它在任何 OUTER JOIN 之前(LEFTRIGHT完整)?


我的理解是匹配列(例如,主键列和外键列)通常没有 NULL 值。当 INNER JOIN 被另一个表编辑时,OUTER JOIN 结果中的任何不匹配行(包括 NULL)都将被删除,仅仅是因为没有将匹配 NULL!!

(顺便说一句,我从来没有使用都具有 NULL 的列连接任何两个表,因此,我不会评论 NULL 值是否匹配INNER JOIN-ing 表时的 NULL 值。我猜至少,这种情况极为罕见)

最佳答案

如果内部联接的 ON 子句要求出现应该是可选的行,则后续的内部联接只会“基本上使”外部联接无效。在这种情况下,重新排序连接要么不起作用,要么无济于事;相反,唯一的解决方法是将内部联接更改为适当的外部联接。

因此,例如,这工作正常:

    SELECT *
      FROM person
 LEFT JOIN address
        ON person.address_id = address.id
INNER JOIN email
        ON person.email_id = email.id

并且等同于将左外连接(第 3-4 行)移动到内部连接(第 5-6 行)之后得到的结果;而这并没有按预期工作:

    SELECT *
      FROM person
 LEFT JOIN address
        ON person.address_id = address.id
INNER JOIN city
        ON address.city_id = city.id

因为第二个ON子句只有在address.city_id为非空时才能满足。 (在这种情况下,正确的解决方法是将内连接更改为左外连接。)

也就是说,我同意 Gordon Linoff 的观点,即通常最好将内部联接放在左外部联接之前;这是因为内部联接倾向于指示更多“基本”限制,因此这种排序通常更具可读性。 (我同意 Gordon Linoff 和 Shawn 的观点,即通常最好避免使用右外连接。)

关于sql - 在任何 OUTER JOIN 之后使用 INNER JOIN 是否真的会使 OUTER JOIN 的效果无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55094277/

相关文章:

mysql - 多个 INNER JOIN 返回 null

sql - 是否有任何程序可以缩小 sql 脚本文件的大小?

mysql - SQL View 获取不符合JOIN条件的记录

php - 内部连接的 group by 和 order by 子句的问题

mysql - 两个内连接和 concat 的 SQL 查询速度

sql - 如何在 T-SQL 中转换变量以进行批量插入?

c# - 使用外键删除 LINQ 中的记录 - 无效强制转换异常

MySQL IN 子句太慢,无法使 JOIN 正常工作

MySQL:对于表中的每一行,更改另一个表中的一行

mysql - 查找两个子查询之间的不同值