我在数据库中有两个具有绑定主键的表,我希望在它们之间找到一个不相交的集合。例如,
Table1
有列(ID, Address
)和样本数据:(1, address2), (2, address2)
有列(ID, Name
)和样本数据
那么,如何创建一个SQL查询,以便可以从不在table2
中的table1
中提取ID为的行。在这种情况下,应该返回(3, Mary)
吗?
PS: ID是这两个表的主键。
发布于 2012-08-21 13:01:19
尝尝这个
SELECT ID, Name
FROM Table1
WHERE ID NOT IN (SELECT ID FROM Table2)
发布于 2012-08-21 13:00:51
使用LEFT JOIN
SELECT a.*
FROM table1 a
LEFT JOIN table2 b
on a.ID = b.ID
WHERE b.id IS NULL
发布于 2019-04-05 07:47:24
基本上有3种方法:not exists
,not in
和left join / 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...)
。一些供应商可能会限制大小。例如,甲骨文就有一个limit of 1,000。最好的做法是尝试所有这三种方法,并显示执行计划。
具体到PostgreSQL中,NOT EXISTS
和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/
https://stackoverflow.com/questions/12048633
复制相似问题