换句话说,对于嵌套/多个 JOIN
SQL 语句,是否应该始终首先使用 INNER JOIN
(要么将其放在顶部行或通过使用括号首先 INNER JOIN
两个表)并确保它在任何 OUTER JOIN
之前(LEFT
,RIGHT
,完整
)?
我的理解是匹配列(例如,主键列和外键列)通常没有 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/