RIGHT JOIN 是 RIGHT OUTER JOIN 的简写。
Consider the excellent explanation in the fine manual:
LEFT OUTER JOIN 返回合格笛卡尔积中的所有行
(即所有通过其连接条件的组合行),加上一份
左侧表格中没有右侧的每一行
通过连接条件的行。此左侧行扩展到
通过为
右侧的列。请注意,只有JOIN 子句自身的条件是
在决定哪些行匹配时考虑。外部条件
之后应用。
相反,RIGHT OUTER JOIN 返回所有连接的行,再加上一行
对于每个不匹配的右侧行(在左侧用空值扩展)。
这只是一种符号方便,因为您可以将其转换为
LEFT OUTER JOIN左右表切换。
我的大胆强调。您的查询只是一种排除其他表中不存在的行的方法,并附有一个闪亮的流行词(“正确排除 JOIN” )。还有其他:
现在,对于棘手的部分 - 或者您偏离原始的地方:
但是当我们在最后一行将其中一个关系的主题设置为 NULL 时会发生什么?
您的查询有:
WHERE sold_subjects.subject IS NULL
原文是这样说的:
WHERE A.<b>Key</b> IS NULL
Key 应该暗示 NOT NULL。如果基础表列sold_subjects.subject 或subjects.subject 可以为NULL,则查询不起作用。 没有办法消除歧义该行是如何限定的:
-
subjects.subject IS NULL 并且在 sold_subjects.subject 中没有带 NULL 的行
-
subjects.subject IS NULL 和 sold_subjects.subject 中的一些带有 NULL 的行
-
subjects.subject IS NOT NULL 但sold_subjects 中没有匹配的行
如果其中一个链接列可以为 NULL,并且您希望将 NULL 值视为实际 值(它们不是),即将 NULL 匹配到NULL,您可以使用NULL-safe operator IS NOT DISTINCT FROM 替换为反连接:
SELECT s.subject
FROM subjects s
LEFT JOIN sold_subjects ss ON ss.subject IS NOT DISTINCT FROM s.subject
WHERE ss.subject IS NULL;
还有更短的语法,使用更常用的LEFT JOIN,但其他方面相同。 IS NOT DISTINCT FROM 通常比简单的 = 慢,只在需要的地方使用它。通常,您在 defined NOT NULL 的键列上连接表 - 隐式(PK 列自动为 NOT NULL)或显式。