【问题标题】:MySQL join to find non-matches or possibly a full outer join with exclusionMySQL 连接以查找不匹配项或可能包含排除的完全外部连接
【发布时间】:2018-01-23 15:10:50
【问题描述】:

我在 MySQL 数据库中有 2 个完全相同的简单表,其中包含不同的数据。我需要一个查询来返回所有不重复的结果。

这是一个例子:

表 1.(“项目”列)

a
b
c
d

表 2.(“项目”列)

a
b
e
f
x

想要的结果

c
d
e
f
x

【问题讨论】:

    标签: mysql join duplicates outer-join


    【解决方案1】:

    试试这个 -

    SELECT * FROM TABLE1 WHERE ITEM NOT IN (SELECT ITEM FROM TABLE2)
    UNION
    SELECT * FROM TABLE2 WHERE ITEM NOT IN (SELECT ITEM FROM TABLE1)
    

    【讨论】:

    • 超级好。认为这是它
    【解决方案2】:

    您可以使用NOT EXISTS,例如:

    SELECT item
    FROM table1 t1 
    WHERE NOT EXISTS (
        SELECT item FROM table2 WHERE item = t1.item
    );
    

    【讨论】:

      【解决方案3】:

      我们可以使用不同的联合 ALL 来加入它们。然后数数并拥有。

      需要独特的,因为我们关心整个集合的独特性。

      SELECT item FROM (
          SELECT distinct item
          FROM tbl1
          UNION ALL
          SELECT distinct item
          FROM tbl2) B
      GROUP BY item
      HAVING count(*) =1 
      

      【讨论】:

        【解决方案4】:
        SELECT * FROM TABLE1 WHERE ITEM NOT IN (SELECT ITEM FROM TABLE2)
        union
        SELECT * FROM TABLE2 WHERE ITEM NOT IN (SELECT ITEM FROM TABLE1)
        

        或者另一种方法是使用内部联接来获取所有重复数据,然后提取所有不在重复数据集中的数据。

        SELECT * into #temptable FROM TABLE1 INNER JOIN TABLE2 on table2.x = table1.x
        union
        SELECT * into #temptable FROM TABLE2 INNER JOIN TABLE1 on table2.x = table1.x
        
        SELECT * FROM Table1 WHERE NOT IN (SELECT * FROM #temptable)
        UNION
        SELECT * FROM Table2 WHERE NOT IN (SELECT * FROM #temptable)
        

        【讨论】:

        • 这不会给出 TABLE2 中的项目。
        • 第一个答案也可以合并得到表2。 SELECT * FROM TABLE1 WHERE ITEM NOT IN (SELECT ITEM FROM TABLE2) UNION SELECT * FROM TABLE2 WHERE ITEM NOT IN (SELECT ITEM FROM TABLE1)
        【解决方案5】:

        很像 xQbert 的,但假设 item 是 UNIQUE/PRIMARY...

        SELECT a.*
          FROM
             ( SELECT item FROM table1
                UNION ALL
               SELECT item FROM table2
             ) a
         GROUP 
            BY item
        HAVING COUNT(*) = 1;
        

        【讨论】:

        • 啊啊啊啊。完全正确。 Union All 将给出重复项,而 Union 将删除它们。感谢您纠正我。
        • 完成。非常感谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 2020-09-22
        • 2015-07-08
        • 2021-10-12
        • 2019-10-25
        • 2014-09-29
        相关资源
        最近更新 更多