Id | Name | Department
-----------------------------
0 | Alice | 1
0 | Alice | 2
1 | Bob | 1
和B表
Id | Name
-------------
0 | Alice
我要選擇表A中所有的唯一的ID在表B中不存在。我怎麼能做到這一點?
Id | Name | Department
-----------------------------
0 | Alice | 1
0 | Alice | 2
1 | Bob | 1
和B表
Id | Name
-------------
0 | Alice
我要選擇表A中所有的唯一的ID在表B中不存在。我怎麼能做到這一點?
SELECT DISTINCT Id FROM A WHERE Id NOT IN (SELECT ID FROM B);
select distinct id
from TableA a
where not exists (
select id
from TableB
where id = a.id
)
SELECT DISTINCT Id FROM A WHERE Id NOT IN(SELECT DISTINCT Id FROM B);
只是提供不同的解決方案比NOT IN:
SELECT DISTINCT A.Id
FROM A
LEFT OUTER JOIN B
ON A.Id = B.Id
WHERE B.Id IS NULL
「好」 的解決方案通常爲負或EXCEPT,但MySQL不支持它。
這個問題被問及前幾次,有人發表文章比較不在,不存在和左外部聯接...是空的。如果有人再次找到它會很有趣!
我會使用一個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
子查詢會得到B.該group by...having
所有的ID將獲得一個所有的唯一ID也不會B.
select *
from A
where id not in
(
select distinct id
from B
)
group by ID
having count(*) > 1;
最有效的答案是使用左連接,因爲使用「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)