选择另一个表中不存在的值
Posted
技术标签:
【中文标题】选择另一个表中不存在的值【英文标题】:select a value where it doesn't exist in another table 【发布时间】:2011-02-27 17:59:14 【问题描述】:我有两张桌子
表 A:
ID
1
2
3
4
表 B:
ID
1
2
3
我有两个请求:
我想选择表 A 中表 B 没有的所有行,在本例中为第 4 行。 我想删除表 B 没有的所有行。我使用的是 SQL Server 2000。
【问题讨论】:
【参考方案1】: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);
【讨论】:
SQL Server 2000 中除外。【参考方案2】:你可以使用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?
【讨论】:
如何在其中添加另一个“where”语句?如果你想说SELECT A.* FROM A WHERE A.ID=1 AND NOT EXISTS(...)
@Chemist 这就是你的做法。多个 where 子句可以与 AND 或 OR 组合,具体取决于您需要的逻辑,与您使用的语法完全相同。
您提供了非常有用的链接,谢谢【参考方案3】:
对于您的第一个问题,至少有三种常用方法可供选择:
不存在 不在 左连接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。
【讨论】:
【参考方案4】: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)
【讨论】:
这个语法有效吗?不应该是 ID 不在 (...) 中的地方吗? 这行不通。正确的语法应该是:SELECT ID FROM A WHERE ID NOT IN (SELECT ID FROM B);
【参考方案5】:
这将在您的情况下选择 4
SELECT ID FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
这会删除它们
DELETE FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
【讨论】:
EXCEPT 不是 SQL Server 2000 的一部分。【参考方案6】:SELECT ID
FROM A
WHERE NOT EXISTS( SELECT 1
FROM B
WHERE B.ID = A.ID
)
【讨论】:
以上是关于选择另一个表中不存在的值的主要内容,如果未能解决你的问题,请参考以下文章