Есть два списка таргетинга: promo_a_users(user_id) и promo_b_users(user_id). Нужно получить пользователей, которые попали ровно в один список (исключающее ИЛИ), чтобы не задвоить коммуникации. Какой вариант верный?

ASELECT user_id FROM promo_a_users INTERSECT SELECT user_id FROM promo_b_users оставит общих пользователей двух списков
BSELECT user_id FROM promo_a_users UNION SELECT user_id FROM promo_b_users соберёт всех пользователей из обоих списков с дедупом
CSELECT a.user_id FROM promo_a_users a JOIN promo_b_users b ON a.user_id = b.user_id соединит совпадающие записи по ключу
D(SELECT user_id FROM promo_a_users EXCEPT SELECT user_id FROM promo_b_users) UNION (SELECT user_id FROM promo_b_users EXCEPT promo_a_users)
Правильный ответ. Исключающее ИЛИ для двух наборов собирается как объединение двух разностей через EXCEPT и UNION.

Разбор

INTERSECT и внутреннее соединение по user_id вернут пользователей, которые есть в обоих списках, — это противоположность задачи. UNION вернёт всех пользователей из обоих списков, включая пересечение, поэтому задвоение коммуникаций как раз случится. Чтобы получить только тех, кто есть ровно в одном из двух списков, берут разность в обе стороны через EXCEPT и затем объединяют результаты через UNION.

Проверь себя · 1/3разбор после ответа
Какое утверждение про RIGHT JOIN верно в аналитических запросах?
Тренировать SQL в Telegram

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