SQL:选择表 A 中不在表 B 中的所有唯一值
Posted
技术标签:
【中文标题】SQL:选择表 A 中不在表 B 中的所有唯一值【英文标题】:SQL: select all unique values in table A which are not in table B 【发布时间】:2010-11-15 16:05:23 【问题描述】:我有桌子 A
Id | Name | Department
-----------------------------
0 | Alice | 1
0 | Alice | 2
1 | Bob | 1
和表 B
Id | Name
-------------
0 | Alice
我想选择表 A 中不存在于表 B 中的所有唯一 ID。我该怎么做?
【问题讨论】:
【参考方案1】:select distinct id
from TableA a
where not exists (
select id
from TableB
where id = a.id
)
【讨论】:
【参考方案2】:只是为了提供与 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 的文章。如果有人能再次找到它会很有趣!
【讨论】:
外连接更好,因为您可以从两个表中选择字段【参考方案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)
【讨论】:
【参考方案4】:我会像这样使用 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
【讨论】:
【参考方案5】:SELECT DISTINCT Id FROM A WHERE Id NOT IN (SELECT ID FROM B);
【讨论】:
【参考方案6】:SELECT DISTINCT Id FROM A WHERE Id NOT IN(SELECT DISTINCT Id FROM B);
【讨论】:
【参考方案7】:子查询将获取 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;
【讨论】:
以上是关于SQL:选择表 A 中不在表 B 中的所有唯一值的主要内容,如果未能解决你的问题,请参考以下文章