2013-04-10 42 views
2

我想比較兩個表並獲得一組結果,其中查找值不匹配,以及其他表中缺少鍵值。第一部分工作正常用下面的查詢:比較兩個表,找到缺失的行和不匹配的數據

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 

然而,那裏是在其它表中沒有對應的ID(因爲ON t1.mID = t2.aID的),它不返回從t1和t2行。

如何在同一個查詢中實現兩者?

+0

你正在使用什麼數據庫系統? – 2013-04-10 13:44:16

回答

7

刪除WHERE子句的ID部分。 FULL OUTER JOINON 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是空搜索:

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 
3

您查詢的where條款過濾掉那些不具有匹配的「標識」行。試試這個:

SELECT m.mId, m.mLookup, a.aId, a.aLookup 
from m 
    full outer join a 
    on a.aId = m.mId 
where m.mId is null 
    or a.aID is null 
    or m.mLookup <> a.aLookup 

完全外部聯接得到所有可能的行,並在where子句保留其中一個或另一邊是空的,並在它們匹配(沒有空)的所有行,只保留那些行,其中的「查找」值有所不同。

相關問題