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

时间:2010-11-15 16:05:24

标签: sql mysql

我有桌子A

Id  | Name      | Department
-----------------------------
0   | Alice     | 1
0   | Alice     | 2
1   | Bob       | 1

和表B

Id  | Name
-------------
0   | Alice     

我想选择表A中表B中不存在的所有唯一ID。我该怎么做?

7 个答案:

答案 0 :(得分:16)

select distinct id 
from TableA a
where not exists (
    select id 
    from TableB 
    where id = a.id
)

答案 1 :(得分:3)

提供与NOT IN不同的解决方案:

SELECT DISTINCT A.Id
FROM A
LEFT OUTER JOIN B
    ON A.Id = B.Id
WHERE B.Id IS NULL

“好”解决方案通常是MINUS或EXCEPT,但MySQL不支持它。

这个问题是在几年前被问到的,有人发布了一篇文章,比较NOT IN,NOT EXISTS和LEFT OUTER JOIN ...... IS NULL。如果有人能再找到它会很有趣!

答案 2 :(得分:3)

最有效的答案是使用左连接,因为使用“NOT IN”有时会阻止查询使用索引(如果存在)。

这种情况下的答案就像是

SELECT DISTINCT 
    * 
FROM 
    TableA a 
LEFT JOIN 
    TableB b
ON 
    a.Id = b.Id 
WHERE 
    b.Id IS NULL

或者,这比左连接更具可读性,并且比NOT IN解决方案更有效

SELECT * FROM TableA a where NOT EXISTS (SELECT * FROM TableB where Id = a.Id)

答案 3 :(得分:1)

我会使用NOT EXISTS这样:

SELECT A.Id
FROM TableA A
WHERE NOT EXISTS (SELECT B.Id FROM TableB B WHERE A.Id = B.Id)
GROUP BY A.Id

答案 4 :(得分:0)

SELECT DISTINCT Id FROM A WHERE Id NOT IN (SELECT ID FROM B);

答案 5 :(得分:0)

SELECT DISTINCT Id FROM A WHERE Id NOT IN(SELECT DISTINCT Id FROM B);

答案 6 :(得分:0)

子查询将获得B中的所有ID。group by...having将获得A中也不在B中的所有唯一ID。

select *
from A 
where id not in
(
    select distinct id
    from B
)
group by ID
having count(*) > 1;