Сравните две таблицы, найдите отсутствующие строки и несогласованные данные

Я хотел бы сравнить две таблицы и получить набор результатов, где значения поиска не совпадают, а также где значения ключа отсутствуют в другой таблице. Первая часть отлично работает со следующим запросом:

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, если в другой таблице нет соответствующего идентификатора (из-за ON t1.mID = t2.aID ).

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

Удалите идентификационную часть WHERE . Для FULL OUTER JOIN ON t1.mID = t2.aID достаточно ON 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 

— РЕДАКТИРОВАТЬ —

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

Предложение 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 сохраняет все строки, где одна или другая сторона равна нулю, и где они соответствуют (ни один из них), сохраняются только те строки, где значения «lookup» различаются.