Нужно сверить остатки товаров между учётной системой и складской. Некоторые товары есть только в одной из систем. Как получить полный список расхождений?

AПрименить FULL OUTER JOIN по product_id плюс COALESCE(a.product_id, b.product_id) для выбора не-NULL ключа
BПрименить INNER JOIN по product_id: он покажет товары, которые есть только в одной из систем сразу автоматически
CПрименить LEFT JOIN в обе стороны и склеить результаты через UNION ALL без дедупликации совпадающих ключей
DПрименить CROSS JOIN и отфильтровать в WHERE строки, где a.product_id отличается от b.product_id по значению
Правильный ответ. FULL OUTER JOIN сохраняет строки из обеих таблиц, а COALESCE(a.product_id, b.product_id) гарантирует, что идентификатор не потеряется.

Разбор

FULL OUTER JOIN объединяет все строки: совпавшие по ключу, строки только из левой таблицы (с NULL справа) и строки только из правой (с NULL слева). Для сверки добавляют WHERE a.qty IS DISTINCT FROM b.qty — это покажет все расхождения. COALESCE(a.product_id, b.product_id) нужен, чтобы получить идентификатор независимо от того, в какой таблице товар присутствует. INNER JOIN отбросит односторонние товары, UNION ALL без дедупликации удвоит совпадения, а CROSS JOIN создаст лишние комбинации.

Проверь себя · 1/3разбор после ответа
Вы объединяете логи событий из двух источников events_web и events_app, чтобы посчитать количество событий. Важно не потерять повторяющиеся события (например, два одинаковых клика). Что лучше использовать для объединения?
Тренировать SQL в Telegram

Ещё вопросы по теме «JOIN и операции множеств»