【问题标题】:SQL: select all unique values in table A which are not in table BSQL:选择表 A 中不在表 B 中的所有唯一值
【发布时间】:2010-11-15 16:05:23
【问题描述】:

我有桌子 A

Id  | Name      | Department
-----------------------------
0   | Alice     | 1
0   | Alice     | 2
1   | Bob       | 1

和表 B

Id  | Name
-------------
0   | Alice     

我想选择表 A 中不存在于表 B 中的所有唯一 ID。我该怎么做?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:
    select distinct id 
    from TableA a
    where not exists (
        select id 
        from TableB 
        where id = a.id
    )
    

    【讨论】:

      【解决方案2】:

      只是为了提供与 NOT IN 不同的解决方案:

      SELECT DISTINCT A.Id
      FROM A
      LEFT OUTER JOIN B
          ON A.Id = B.Id
      WHERE B.Id IS NULL
      

      “好的”解决方案通常是 MINUS 或 EXCEPT,但 MySQL 不支持它。

      前段时间有人问过这个问题,有人发了一篇比较 NOT IN、NOT EXISTS 和 LEFT OUTER JOIN ... IS NULL 的文章。如果有人能再次找到它会很有趣!

      【讨论】:

      • 外连接更好,因为您可以从两个表中选择字段
      【解决方案3】:

      最有效的答案是使用左连接,因为使用“NOT IN”有时会阻止查询使用索引(如果存在)。

      这种情况下的答案是这样的

      SELECT DISTINCT 
          * 
      FROM 
          TableA a 
      LEFT JOIN 
          TableB b
      ON 
          a.Id = b.Id 
      WHERE 
          b.Id IS NULL
      

      或者,这比左连接更具可读性,并且比 NOT IN 解决方案更有效

      SELECT * FROM TableA a where NOT EXISTS (SELECT * FROM TableB where Id = a.Id)
      

      【讨论】:

        【解决方案4】:

        我会像这样使用 NOT EXISTS:

        SELECT A.Id
        FROM TableA A
        WHERE NOT EXISTS (SELECT B.Id FROM TableB B WHERE A.Id = B.Id)
        GROUP BY A.Id
        

        【讨论】:

          【解决方案5】:
          SELECT DISTINCT Id FROM A WHERE Id NOT IN (SELECT ID FROM B);
          

          【讨论】:

            【解决方案6】:
            SELECT DISTINCT Id FROM A WHERE Id NOT IN(SELECT DISTINCT Id FROM B);
            

            【讨论】:

              【解决方案7】:

              子查询将获取 B 中的所有 ID。group by...having 将获取 A 中也不在 B 中的所有唯一 ID。

              select *
              from A 
              where id not in
              (
                  select distinct id
                  from B
              )
              group by ID
              having count(*) > 1;
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-01-09
                • 2019-05-16
                • 2013-03-31
                • 2011-06-25
                • 1970-01-01
                • 1970-01-01
                • 2011-06-07
                • 2017-08-08
                相关资源
                最近更新 更多