我有桌子A
Id | Name | Department
-----------------------------
0 | Alice | 1
0 | Alice | 2
1 | Bob | 1
和表B
Id | Name
-------------
0 | Alice
我想选择表A中表B中不存在的所有唯一ID。我该怎么做?
答案 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;