2013-04-10 99 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子句保留其中一个或另一边是空的,并在它们匹配(没有空)的所有行,只保留那些行,其中的“查找”值有所不同。

相关问题