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 中的所有唯一值的主要内容,如果未能解决你的问题,请参考以下文章

SQL 存在一个表而不在另一个表中的数据

SQL查询 —— 存在一个表而不在另一个表中的数据

从表 A 中获取不在表 B 中的记录

T-SQL:如何在值列表中选择不在表中的值?

SQL中,如何查询存在一个表而不在另一个表中的数据记录

SQL中,如何查询存在一个表而不在另一个表中的数据记录