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

Wai*_*ong 52 sql sql-server-2000

我有两张桌子

表A:

ID
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

表B:

ID
1
2
3
Run Code Online (Sandbox Code Playgroud)

我有两个要求:

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

我正在使用SQL Server 2000.

Tim*_*ter 89

你可以使用NOT IN:

SELECT A.* FROM A WHERE ID NOT IN(SELECT ID FROM B)
Run Code Online (Sandbox Code Playgroud)

但是,同时我更喜欢NOT EXISTS:

SELECT A.* FROM A WHERE NOT EXISTS(SELECT 1 FROM B WHERE B.ID=A.ID)
Run Code Online (Sandbox Code Playgroud)

还有其他选项,本文非常好地解释了所有优点和缺点:

我应该使用NOT IN,OUTER APPLY,LEFT OUTER JOIN,EXCEPT还是NOT EXISTS?

  • 您如何在其中添加另一个“ where”语句?如果您想说``从A.ID = 1且不存在(...)的情况下选择A. *'' (2认同)

Mar*_*ers 27

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

  • 不存在
  • 不在
  • LEFT JOIN

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
Run Code Online (Sandbox Code Playgroud)

根据您使用的数据库,每个数据库的性能可能会有所不同.对于SQL Server(不可为空的列):

NOT EXISTS和NOT IN谓词是搜索缺失值的最佳方法,只要两个列都是NOT NULL即可.