91

我有一个定义表,我知道它维护得不是很好,我们称之为table A. 我有另一个table B小得多的表(称为它),理想情况下应该是 asubset of table A但我知道它table A有些陈旧并且不包含Table B.

请注意,表 A 和 B 具有不同的列。

Table A:
ID, Name, blah, blah, blah, blah

Table B:
ID, Name

我想要表 B 中的所有行,使得表 B 中的 ID 不存在于表 A 中。这不仅匹配表 A 中的行;还匹配表 A 中的行。我只想要表 B 中 ID 在表 A 中根本不存在的行。

4

5 回答 5

192
SELECT *
FROM   B
WHERE  NOT EXISTS (SELECT 1 
                   FROM   A 
                   WHERE  A.ID = B.ID)
于 2013-04-10T23:21:46.573 回答
33

适用于几乎所有环境的经典答案是

SELECT ID, Name, blah, blah
FROM TableB TB
LEFT JOIN TableA TA
ON TB.ID=TA.ID
WHERE TA.ID IS NULL

有时 NOT EXISTS 可能没有实现(不工作)。

于 2017-04-05T22:15:31.577 回答
14

如果您设置使用 EXISTS,您可以在 SQL Server 中使用以下内容:

SELECT * FROM TableB as b
WHERE NOT EXISTS
(
   SELECT * FROM TableA as a
   WHERE b.id = a.id
)
于 2013-04-10T23:22:15.860 回答
6

这也有效

SELECT *
FROM tableB
WHERE ID NOT IN (
  SELECT ID FROM tableA
);
于 2019-12-11T18:43:40.937 回答
0

或者如果“不存在”没有实现

SELECT *
FROM   B
WHERE (SELECT count(*)  FROM   A WHERE  A.ID = B.ID) < 1
于 2017-11-16T11:50:26.157 回答