Как получить разность двух таблиц, используя JOIN?

Помогите решить задачу на SQL, над которой я ломаю голову уже несколько дней.

Даны две таблицы с одинаковой структурой: key1, key2, value1, value2, value3. Key1 и key2 очевидно ключи. В таблицах могут быть отличия как в ключах, так и значениях, значения могут содерждать NULL.

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

Итого должна получиться таблица source, key1, key2, value1, value2, value3. Также бонусом можно добавить столбец, который будет указывать причину ошибки: 0 - у таблиц различается атрибутивный состав записей, 1 - запись есть только в одной из таблиц.

СУБД Postgres. UNION использовать нежелательно, EXCEPT также, нужны JOINы.


Ответы (1 шт):

Автор решения: Akina
SELECT t1.*, 1 AS source
FROM t1
NATURAL LEFT JOIN t2
WHERE t2.id IS NULL
UNION ALL
SELECT t2.*, 2
FROM t2
NATURAL LEFT JOIN t1
WHERE t1.id IS NULL

tN.id - это первичный ключ таблицы либо любое NOT NULL поле. В структуре из вопроса может использоваться любое поле из выражения композитного первичного ключа, например, key1.

Union ресурсозатратный при большом количестве столбцов. А если потребуется масштабирование, то запрос станет неэффективным.

В свете того, что потребуется объединение двух таблиц по всем полям, на "ресурсозатратность" UNION уже можно смело наплевать. И запрос изначально по жизни неэффективен.

→ Ссылка