选择另一个表中不存在的值

我有两张桌子

表 A:

ID
1
2
3
4

表 B:

ID
1
2
3

我有两个要求:

  • 我想选择表 A 中表 B 没有的所有行,在本例中是第4行。
  • 我想删除表 B 没有的所有行。

我正在使用 SQLServer2000。

175858 次浏览
select ID from A where ID not in (select ID from B);

或者

select ID from A except select ID from B;

你的第二个问题是:

delete from A where ID not in (select ID from B);

你可以使用 NOT IN:

SELECT A.* FROM A WHERE ID NOT IN(SELECT ID FROM B)

然而,与此同时,我更喜欢 NOT EXISTS:

SELECT A.* FROM A WHERE NOT EXISTS(SELECT 1 FROM B WHERE B.ID=A.ID)

还有其他的选择,本文很好地解释了所有的优点和缺点:

我应该使用不在,外部应用,左外部连接,除非,或不存在?

对于你的第一个问题,至少有三种常见的方法可供选择:

  • 不存在
  • 不在
  • 左连接

SQL 看起来像这样:

SELECT * FROM TableA WHERE NOT EXISTS (
SELECT NULL
FROM TableB
WHERE TableB.ID = TableA.ID
)


SELECT * FROM TableA WHERE ID NOT IN (
SELECT ID FROM TableB
)


SELECT TableA.* FROM TableA
LEFT JOIN TableB
ON TableA.ID = TableB.ID
WHERE TableB.ID IS NULL

根据使用的数据库的不同,每个数据库的性能可能不同:

NOT EXISTS 和 NOT IN 谓词是搜索缺失值的最佳方法,只要有问题的两列都不为 NULL。

SELECT ID
FROM A
WHERE ID NOT IN (
SELECT ID
FROM B);

SELECT ID
FROM A a
WHERE NOT EXISTS (
SELECT 1
FROM B b
WHERE b.ID = a.ID)

         SELECT a.ID
FROM A a
LEFT OUTER JOIN B b
ON a.ID = b.ID
WHERE b.ID IS NULL

DELETE
FROM A
WHERE ID NOT IN (
SELECT ID
FROM B)

这将在您的情况下选择4

SELECT ID FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)

这会删除它们

DELETE FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
SELECT ID
FROM A
WHERE NOT EXISTS( SELECT 1
FROM B
WHERE B.ID = A.ID
)