Об этом уже спрашивали о переполнении стека , но только для MySQL. Я использую PostgreSQL. К сожалению (и удивительно), PostgreSQL, похоже, не имеет ничего подобногоCHECKSUM table
.
Решение PostgreSQL было бы хорошо, но общее решение было бы лучше. Я нашел http://www.besttechtools.com/articles/article/sql-query-to-check-two-tables-have-identical-data , но я не понимаю используемую логику.
Предыстория: я переписал некоторый код, генерирующий базу данных, поэтому мне нужно проверить, дают ли старый и новый код одинаковые результаты.
postgresql
duplication
Фахим Митха
источник
источник
EXCEPT
, проверьте этот вопрос: эффективный способ сравнить два больших набора данных в SQLОтветы:
Одним из вариантов является использование FULL OUTER JOIN между двумя таблицами в следующей форме:
Например:
Вернет счет 2, тогда как:
возвращает ожидаемое количество 0.
Что мне нравится в этом методе, так это то, что ему нужно только прочитать каждую таблицу по сравнению с чтением каждой таблицы дважды при использовании EXISTS. Кроме того, это должно работать для любой базы данных, которая поддерживает полные внешние объединения (не только Postgresql).
Я вообще не рекомендую использовать предложение USING, но здесь есть одна ситуация, где я считаю, что это лучший подход.
Приложение 2019-05-03:
Если существует проблема с возможными нулевыми данными (т. Е. Столбец id не обнуляемый, а значение val), вы можете попробовать следующее:
источник
Вы можете использовать
EXCEPT
оператор. Например, если таблицы имеют одинаковую структуру, следующие будут возвращать все строки, которые находятся в одной таблице, но не в другой (поэтому 0 строк, если таблицы имеют идентичные данные):Или с помощью,
EXISTS
чтобы вернуть только логическое значение или строку с одним из 2 возможных результатов:Протестировано в SQLfiddle
Также не то, что
EXCEPT
удаляет дубликаты (это не должно беспокоить, если ваши таблицы имеют некоторыеPRIMARY KEY
илиUNIQUE
ограничения ограничения, но это может быть, если вы сравниваете результаты произвольных запросов, которые могут потенциально привести к дублированию строк).Другая вещь, которую
EXCEPT
делает ключевое слово, - это то, что оно обрабатываетNULL
значения как идентичные, поэтому, если в таблицеA
есть строка с,(1,2,NULL)
а в таблицеB
есть строка с(1,2,NULL)
, первый запрос не будет отображать эти строки, а второй запрос вернется,'same'
если у двух таблиц нет другой строки.Если вы хотите считать такие строки разными, вы можете использовать вариант
FULL JOIN
ответа gsiems , чтобы получить все (разные) строки:и получить ответ да / нет:
Если все столбцы этих двух таблиц не обнуляются, два подхода дадут одинаковые ответы.
источник
SELECT <column_list> FROM a
вместоTABLE a
EXCEPT
Запрос является Beaut!Вам нужно, кроме пункта что-то вроде
Это возвращает все строки из первой таблицы, которые не во второй таблице
источник
Глядя на связанный код, вы не понимаете:
Секретный соус использует
union
в отличие отunion all
. В первом сохраняются только отдельные строки, а во втором - дубликаты ( ссылка ). Другими словами, во вложенных запросах говорится: «Дайте мне все строки и столбцы из EmpDtl1 и, кроме того, из EmpDtl2, которых еще нет в EmpDtl1». Количество этого подзапроса будет равно количеству EmpDtl1 в том и только в том случае, если EmpDtl2 не вносит каких-либо строк в результат, т.е. две таблицы идентичны.Кроме того, дамп таблицы в последовательности ключей в два текстовых файла и использовать свой инструмент сравнения по вашему выбору.
источник
EmpDtl2
имеет меньше строк , чемEmpDtl1
и все существующие строки существуют вEmpDtl1
.