我想比较两个表并获得一组结果,其中查找值不匹配以及其他表中的键值缺失。第一部分在以下查询中可以正常工作:
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)。
ON t1.mID = t2.aID
如何在同一查询中实现两者?
删除WHERE子句的ID部分。在FULL OUTER JOIN ON t1.mID = t2.aID足以表连接在一起。FULL OUTER JOIN将返回联接中的两个表,即使其中一个不匹配也是如此。
WHERE
FULL OUTER JOIN
但是,该WHERE t1.m_ID = t2.aID子句将结果限制为两个表中都存在的ID。这有效地导致的FULL OUTER JOIN行为像INNER JOIN。
WHERE t1.m_ID = t2.aID
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