СУБД не поддерживает FULL OUTER JOIN (например, MySQL версии до 8.0). Как корректно эмулировать его для сверки таблиц system_a и system_b по product_id?

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

Разбор

Классический способ: SELECT * FROM a LEFT JOIN b USING(id) UNION ALL SELECT * FROM a RIGHT JOIN b USING(id) WHERE a.id IS NULL. Первая часть даёт все строки из a со совпадениями из b. Вторая — только строки из b без пары. UNION ALL сохраняет все строки без дедупликации. LEFT JOIN с COALESCE теряет строки, которые есть только в b. CROSS JOIN со фильтром даёт декартово произведение, а не сверку. Один INNER JOIN теряет несовпавшие строки с обеих сторон.

Проверь себя · 1/3разбор после ответа
Нужно получить уникальный список идентификаторов пользователей из двух каналов: campaign_a(user_id) и campaign_b(user_id). Как корректнее объединить списки, чтобы убрать дубликаты?
Тренировать SQL в Telegram

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