【问题标题】:sql: check if entry in table A exists in table Bsql:检查表A中的条目是否存在于表B中
【发布时间】:2013-04-03 00:32:06
【问题描述】:

我有一个定义表,我知道它没有得到很好的维护,我们称之为table A。我有另一个表(称为table B),它要小得多,理想情况下应该是subset of table A,但我知道table A 有点陈旧,并且不包含Table B 中的新条目。

注意,表 A 和 B 有不同的列。

Table A:
ID, Name, blah, blah, blah, blah

Table B:
ID, Name

我希望表 B 中的所有行都使得表 B 中的 ID 不存在于表 A 中。这不仅仅匹配表 A 中的行;我只想要表 B 中 ID 在表 A 中根本不存在的行。

【问题讨论】:

    标签: sql exists


    【解决方案1】:
    SELECT *
    FROM   B
    WHERE  NOT EXISTS (SELECT 1 
                       FROM   A 
                       WHERE  A.ID = B.ID)
    

    【讨论】:

    • @algotr8der,我很高兴能提供帮助。美好的一天。
    • select * from TableB b where b.ID not in (select a.ID from TableA a)
    • @vakio 感谢您的询问。您绝对应该将您的评论作为答案。
    • @AnalyticalMonk 我希望你知道它是完全相同的查询,它产生完全相同的结果。只是稍微不同的语法,仅此而已
    • @ManosKounelakis Select 1 表示返回 1 作为每一行的结果。它通常用来表示结果并不重要,但只有存在才是最重要的。您可以将1 更改为每个有效值(*、1、2、3、column1、column2),结果不会改变。
    【解决方案2】:

    适用于几乎所有环境的经典答案是

    SELECT ID, Name, blah, blah
    FROM TableB TB
    LEFT JOIN TableA TA
    ON TB.ID=TA.ID
    WHERE TA.ID IS NULL
    

    有时 NOT EXISTS 可能未实现(不起作用)。

    【讨论】:

    • 谢谢,帮了大忙!
    • 这个查询比SELECT * FROM B WHERE NOT EXISTS (SELECT 1 FROM A WHERE A.ID = B.ID)效率更高
    • DUAL 是特殊的一行一列的表,默认存在于所有Oracle 数据库中。 DUAL 的所有者是 SYS(SYS 拥有数据字典,因此 DUAL 是数据字典的一部分。)但每个用户都可以访问 DUAL。该表有一个名为 DUMMY 的 VARCHAR2(1) 列,其值为“X”。 MySQL 允许在不需要来自任何表的数据的查询中将 DUAL 指定为表。在 SQL Server DUAL 表中不存在,但您可以创建一个。
    • 比不存在更快
    【解决方案3】:

    如果您设置使用 EXISTS,您可以在 SQL Server 中使用以下内容:

    SELECT * FROM TableB as b
    WHERE NOT EXISTS
    (
       SELECT * FROM TableA as a
       WHERE b.id = a.id
    )
    

    【讨论】:

      【解决方案4】:

      这也有效

      SELECT *
      FROM tableB
      WHERE ID NOT IN (
        SELECT ID FROM tableA
      );
      

      【讨论】:

        【解决方案5】:

        或者如果“不存在”没有实现

        SELECT *
        FROM   B
        WHERE (SELECT count(*)  FROM   A WHERE  A.ID = B.ID) < 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-07
          • 1970-01-01
          • 1970-01-01
          • 2018-05-09
          • 2019-12-14
          相关资源
          最近更新 更多