SQL:选择表A中不在表B中的所有唯一值

an0*_*mus 6 mysql sql

我有桌子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)


Vin*_*ard 7

只是为了提供与 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 的文章。如果有人能再次找到它会很有趣!


Run*_*pot 6

最有效的答案是使用左连接,因为使用“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)


Vla*_*nov 0

SELECT DISTINCT Id FROM A WHERE Id NOT IN (SELECT ID FROM B);
Run Code Online (Sandbox Code Playgroud)