PSQL-запрос для сопоставления данных из двух экземпляров базы данных

У меня есть два экземпляра одной базы данных из разных дней. Все таблицы одного дня называются tableA*, а другие таблицы B*. Я хотел бы сравнить данные, чтобы увидеть, что изменилось. Я хотел бы выбрать все строки, которые не совпадают точно. Так, например, если одно значение отличается в таблицах tableA1 и tableB1, я хотел бы выбрать соответствующую строку из таблицы A, пометить ее как "новую" и из таблицы B и пометить как "удаленную". Я пытался с запросом, как это:

SELECT 'new', ta1.name, ta2.name, ta3.name, ta4.name, ta5.name
FROM tableA1 ta1
LEFT JOIN tableA2 ta2 ON ta1.ta2_id = ta2.id
LEFT JOIN tableA3 ta3 ON ta1.ta3_id = ta3.id
LEFT JOIN tableA4 ta4 ON ta1.ta4_id = ta4.id
LEFT JOIN tableA5 ta5 ON ta5.ta1_id = ta1.id WHERE NOT EXISTS
(SELECT tb1.name, tb2.name, tb3.name, tb4.name, tb5.name
FROM tableB1 tb1
LEFT JOIN tableB2 tb2 ON tb1.tb2_id = tb2.id
LEFT JOIN tableB3 tb3 ON tb1.tb3_id = tb3.id
LEFT JOIN tableB4 tb4 ON tb1.tb4_id = tb4.id
LEFT JOIN tableB5 tb5 ON tb5.tb1_id = tb1.id WHERE 
tb1.name = ta1.name AND 
tb2.name = ta2.name AND 
tb3.name = ta3.name AND 
tb4.name = ta4.name AND 
tb5.name = ta5.name)
UNION
SELECT 'deleted', tb1.name, tb2.name, tb3.name, tb4.name, tb5.name
FROM tableB1 tb1
LEFT JOIN tableB2 tb2 ON tb1.tb2_id = tb2.id
LEFT JOIN tableB3 tb3 ON tb1.tb3_id = tb3.id
LEFT JOIN tableB4 tb4 ON tb1.tb4_id = tb4.id
LEFT JOIN tableB5 tb5 ON tb5.tb1_id = tb1.id WHERE NOT EXISTS
(SELECT ta1.name, ta2.name, ta3.name, ta4.name, ta5.name
FROM tableA1 ta1
LEFT JOIN tableA2 ta2 ON ta1.ta2_id = ta2.id
LEFT JOIN tableA3 ta3 ON ta1.ta3_id = ta3.id
LEFT JOIN tableA4 ta4 ON ta1.ta4_id = ta4.id
LEFT JOIN tableA5 ta5 ON ta5.ta1_id = ta1.id WHERE 
tb1.name = ta1.name AND 
tb2.name = ta2.name AND 
tb3.name = ta3.name AND 
tb4.name = ta4.name AND 
tb5.name = ta5.name)

Надеюсь, что если бы я создал тот же самый stuructre и сравнил все значения, я получил бы ожидаемый результат. Даже если базы данных совпадают, я выбираю много строк.

1 ответ

Решение

Нашел проблему. При сравнении двух значений NULL результатом является FALSE, сам запрос должен быть в порядке. Поэтому я должен был добавить условия, чтобы проверить, являются ли значения NULL.

Другие вопросы по тегам