Есть два списка таргетинга: 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 INNER 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 SELECT user_id FROM promo_a_users);
Правильный ответ. Исключающее ИЛИ для двух наборов можно собрать как объединение двух разностей через EXCEPT и UNION.

Разбор

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

Проверь себя · 1/3разбор после ответа
Нужно сверить остатки товаров между учётной системой и складской. Некоторые товары есть только в одной из систем. Как получить полный список расхождений?
Тренировать SQL в Telegram

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