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)