Вы можете использовать EXCEPT
оператор. Например, если таблицы имеют одинаковую структуру, следующие будут возвращать все строки, которые находятся в одной таблице, но не в другой (поэтому 0 строк, если таблицы имеют идентичные данные):
(TABLE a EXCEPT TABLE b)
UNION ALL
(TABLE b EXCEPT TABLE a) ;
Или с помощью, EXISTS
чтобы вернуть только логическое значение или строку с одним из 2 возможных результатов:
SELECT CASE WHEN EXISTS (TABLE a EXCEPT TABLE b)
OR EXISTS (TABLE b EXCEPT TABLE a)
THEN 'different'
ELSE 'same'
END AS result ;
Протестировано в SQLfiddle
Также не то, что EXCEPT
удаляет дубликаты (это не должно беспокоить, если ваши таблицы имеют некоторые PRIMARY KEY
илиUNIQUE
ограничения ограничения, но это может быть, если вы сравниваете результаты произвольных запросов, которые могут потенциально привести к дублированию строк).
Другая вещь, которую EXCEPT
делает ключевое слово, - это то, что оно обрабатывает NULL
значения как идентичные, поэтому, если в таблице A
есть строка с, (1,2,NULL)
а в таблице B
есть строка с (1,2,NULL)
, первый запрос не будет отображать эти строки, а второй запрос вернется, 'same'
если у двух таблиц нет другой строки.
Если вы хотите считать такие строки разными, вы можете использовать вариант FULL JOIN
ответа gsiems , чтобы получить все (разные) строки:
SELECT *
FROM a NATURAL FULL JOIN b
WHERE a.some_not_null_column IS NULL
OR b.some_not_null_column IS NULL ;
и получить ответ да / нет:
SELECT CASE WHEN EXISTS
( SELECT *
FROM a NATURAL FULL JOIN b
WHERE a.some_not_null_column IS NULL
OR b.some_not_null_column IS NULL
)
THEN 'different'
ELSE 'same'
END AS result ;
Если все столбцы этих двух таблиц не обнуляются, два подхода дадут одинаковые ответы.
EXCEPT
, проверьте этот вопрос: эффективный способ сравнить два больших набора данных в SQL