我有桌子A.
Id | Name | Department
-----------------------------
0 | Alice | 1
0 | Alice | 2
1 | Bob | 1
Run Code Online (Sandbox Code Playgroud)
和表B.
Id | Name
-------------
0 | Alice
Run Code Online (Sandbox Code Playgroud)
我想在表A中选择表B中不存在的所有唯一ID.我该怎么做?
Red*_*ter 17
select distinct id
from TableA a
where not exists (
select id
from TableB
where id = a.id
)
Run Code Online (Sandbox Code Playgroud)
只是为了提供与 NOT IN 不同的解决方案:
SELECT DISTINCT A.Id
FROM A
LEFT OUTER JOIN B
ON A.Id = B.Id
WHERE B.Id IS NULL
Run Code Online (Sandbox Code Playgroud)
“好的”解决方案通常是 MINUS 或 EXCEPT,但 MySQL 不支持它。
前几天有人问过这个问题,有人发布了一篇比较 NOT IN、NOT EXISTS 和 LEFT OUTER JOIN ... IS NULL 的文章。如果有人能再次找到它会很有趣!
最有效的答案是使用左连接,因为使用“NOT IN”有时会阻止查询使用索引(如果存在)。
在这种情况下的答案是这样的
SELECT DISTINCT
*
FROM
TableA a
LEFT JOIN
TableB b
ON
a.Id = b.Id
WHERE
b.Id IS NULL
Run Code Online (Sandbox Code Playgroud)
或者,这比左连接更具可读性,并且比 NOT IN 解决方案更高效
SELECT * FROM TableA a where NOT EXISTS (SELECT * FROM TableB where Id = a.Id)
Run Code Online (Sandbox Code Playgroud)
SELECT DISTINCT Id FROM A WHERE Id NOT IN (SELECT ID FROM B);
Run Code Online (Sandbox Code Playgroud)