2013-04-10 2 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 

Тем не менее, он не возвращает строки из t1 и t2, где нет соответствующей ID в другой таблице (из-за ON t1.mID = t2.aID).

Как я могу достичь как в одном запросе?

+0

Какая система баз данных вы используете? –

ответ

7

Удалите идентификационную часть WHERE. FULL OUTER JOINON t1.mID = t2.aID достаточно, чтобы связать таблицы вместе. FULL OUTER JOIN вернет обе таблицы в соединение, даже если у вас нет соответствия.

Однако предложение WHERE t1.m_ID = t2.aID ограничивает результаты идентификаторами, которые существуют в обеих таблицах. Это фактически приводит к тому, что 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 

- EDIT -

Перечитывая свой вопрос, вы хотите только несовпадений. В этом случае, вам нужно искать на где 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 
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 

Полное внешнее объединение получает все возможные строки, и где положение сохраняет все строки, в которых один или другой стороны являются недействительными и, где они совпадают (не пустое), сохраняет только те строки, в которых Значения «lookup» различаются.

Смежные вопросы