Локально симметричная разница в SQL
-
01-10-2019 - |
Вопрос
У меня проблема похожа на Этот вопрос стойки, За исключением того, что мне нужно исключить определенные поля из сравнения, но все равно включают его в набор результатов.
Я заказываю проблему как локально симметричную разницу.
Например, таблица A и B имеют столбцы X, Y, Z, и я хочу сравнить только Y, Z для различий, но я все еще хочу, чтобы результат был включен X.
Решение
Старый стиль SQL для полного соединения - объединенный с B, исключая строки в B также в (середине):
-- all rows in A with or without matching B
select a.x, a.y, a.z
from a
left join b
on a.x = b.x
and a.y = b.y
union all
-- all rows in B with no match in A to "exclude the middle"
select b.x, b.y, null as z
from b
where not exists (select null
from a
where b.x = a.x
and b.y = a.y)
Стиль ANSI:
select coalesce(a.x, b.x) as x,
coalesce(a.y, b.y) as y,
a.z
from a
full outer join b
on a.x = b.x
and a.y = b.y
Coalesce есть там для безопасности; У меня никогда не было причина написать полный внешний присоединиться в реальном мире.
Если то, что вы действительно хотите выяснить, будут ли две таблицы идентичны, вот как:
SELECT COUNT(*)
FROM (SELECT list_of_columns
FROM one_of_the_tables
MINUS
SELECT list_of_columns
FROM the_other_table
UNION ALL
SELECT list_of_columns
FROM the_other_table
MINUS
SELECT list_of_columns
FROM one_of_the_tables)
Если это возвращает ненулевой результат, то есть разница. Это не говорит вам, какой стол это в том, но это начало.
Другие советы
Похоже, это в основном то, что вы хотите. Соответствие рядов между двумя таблицами на столбцах y и z найдите непревзойденные строки и выведите значения столбцов X, Y и Z.
SELECT a.x, a.y, a.z, b.x, b.y, b.z
FROM a FULL OUTER JOIN b ON a.y = b.y AND a.z = b.z
WHERE a.y IS NULL OR b.y IS NULL