【问题标题】: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。

【问题讨论】:

    标签: sql 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
                       )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 2021-08-18
        • 2016-07-28
        • 2014-02-21
        • 2015-08-27
        相关资源
        最近更新 更多