【发布时间】:2011-02-27 17:59:14
【问题描述】:
我有两张桌子
表 A:
ID
1
2
3
4
表 B:
ID
1
2
3
我有两个请求:
- 我想选择表 A 中表 B 没有的所有行,在本例中为第 4 行。
- 我想删除表 B 没有的所有行。
我使用的是 SQL Server 2000。
【问题讨论】:
标签: sql sql-server-2000
我有两张桌子
表 A:
ID
1
2
3
4
表 B:
ID
1
2
3
我有两个请求:
我使用的是 SQL Server 2000。
【问题讨论】:
标签: sql sql-server-2000
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)
还有其他选择,这篇文章很好地解释了所有的优点和缺点:
Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?
【讨论】:
SELECT A.* FROM A WHERE A.ID=1 AND NOT EXISTS(...)
对于您的第一个问题,至少有三种常用方法可供选择:
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
根据您使用的数据库,每个数据库的性能可能会有所不同。对于SQL Server(不可为空的列):
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)
【讨论】:
SELECT ID 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
)
【讨论】: