小编典典

比较两个表,查找丢失的行和不匹配的数据

sql

我想比较两个表并获得一组结果,其中查找值不匹配以及其他表中的键值缺失。第一部分在以下查询中可以正常工作:

SELECT * FROM (
    SELECT  mID, mLookup
    FROM m) t1

FULL OUTER JOIN (
    SELECT  aID, aLookup
    FROM a) t2

ON t1.mID = t2.aID

WHERE
    t1.mID = t2.aID AND
    t1.mLookup <> t2.aLookup

但是,它不会返回t1和t2中其他表中没有对应ID的行(由于ON t1.mID = t2.aID)。

如何在同一查询中实现两者?


阅读 174

收藏
2021-04-28

共1个答案

小编典典

删除WHERE子句的ID部分。在FULL OUTER JOIN ON t1.mID = t2.aID足以表连接在一起。FULL OUTER
JOIN将返回联接中的两个表,即使其中一个不匹配也是如此。

但是,该WHERE t1.m_ID = t2.aID子句将结果限制为两个表中都存在的ID。这有效地导致的FULL OUTER JOIN行为像INNER JOIN

换一种说法:

SELECT * FROM (
    SELECT  mID, mLookup
    FROM m) t1

FULL OUTER JOIN (
    SELECT  aID, aLookup
    FROM a) t2

ON t1.mID = t2.aID

WHERE
    --t1.mID = t2.aID AND -- remove this line
    t1.mLookup <> t2.aLookup

- 编辑 -

重新阅读您的问题,您只想要不匹配的内容。在这种情况下,您需要搜索任何一方的ID为NULL的位置:

SELECT * FROM (
    SELECT  mID, mLookup
    FROM m) t1

FULL OUTER JOIN (
    SELECT  aID, aLookup
    FROM a) t2

ON t1.mID = t2.aID

WHERE
    t1.mID IS NULL OR
    t2.mID IS NULL OR
    t1.mLookup <> t2.aLookup
2021-04-28