基本上有 3 种方法not exists
:not in
和left join / is null
。
IS NULL 左连接
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
不在
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
不存在
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
哪一个更好?这个问题的答案可能最好分解为主要的特定 RDBMS 供应商。一般来说,select ... where ... in (select...)
当子查询中的记录数大小未知时,应避免使用。一些供应商可能会限制尺寸。例如,Oracle 的限制为 1,000。最好的办法是尝试所有三个并显示执行计划。
NOT EXISTS
具体形成 PostgreSQL ,其执行计划LEFT JOIN / IS NULL
是一样的。我个人更喜欢这个NOT EXISTS
选项,因为它更好地显示了意图。毕竟语义是您想在 A 中查找其 pk不存在于 B中的记录。
旧但仍然是黄金,虽然特定于 PostgreSQL:https ://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/