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

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
                 )

【讨论】:

以上是关于选择另一个表中不存在的值的主要内容,如果未能解决你的问题,请参考以下文章

表格/查询中不存在MS Access Combobox的值

从一个表中选择 Laravel 5.1 中另一个表中不存在的所有记录

如何从一个表中选择另一张表中不存在的所有记录?

如何从一个表中选择另一张表中不存在的所有记录?

删除一个表中存在而另一个表中不存在的数据?

mySQL 从一个表中选择,该表在另一个表中不存在,并且不是第三个表中的子表