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

gre*_*can 2 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
Run Code Online (Sandbox Code Playgroud)

但是,它不返回t1和t2中的行,其中在另一个表中没有相应的ID(因为ON t1.mID = t2.aID).

如何在同一个查询中实现这两个目标?

Pau*_*ams 7

删除该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
Run Code Online (Sandbox Code Playgroud)

- 编辑 -

重新阅读你的问题,你只想要不匹配.在这种情况下,您需要搜索任何一方的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
Run Code Online (Sandbox Code Playgroud)