Нужно посчитать количество уникальных пользователей, которые совершили событие либо в web (events_web(user_id)), либо в app (events_app(user_id)). Какой запрос посчитает корректно, если один и тот же пользователь мог быть в обоих источниках?

ASELECT COUNT(*) FROM (SELECT user_id FROM events_web UNION ALL SELECT user_id FROM events_app) t;
BSELECT COUNT(*) FROM (SELECT user_id FROM events_web UNION SELECT user_id FROM events_app) t;
CSELECT COUNT(*) FROM events_web w INNER JOIN events_app a ON w.user_id = a.user_id;
DSELECT COUNT(*) FROM (SELECT user_id FROM events_web INTERSECT SELECT user_id FROM events_app) t;
Правильный ответ. Для уникальных пользователей по двум источникам используйте UNION (он убирает повторы) перед COUNT(*).

Разбор

Если использовать UNION ALL, пользователь, встретившийся в обоих источниках, попадёт дважды и будет посчитан два раза. UNION возвращает объединение множеств без дублей, поэтому COUNT(*) по результату даст количество уникальных пользователей, которые были хотя бы в одном источнике.

Проверь себя · 1/3разбор после ответа
Запрос 1: SELECT * FROM users u LEFT JOIN orders o ON o.user_id = u.id WHERE o.amount > 1000. Запрос 2: SELECT * FROM users u LEFT JOIN orders o ON o.user_id = u.id AND o.amount > 1000. Чем отличаются результаты?
Тренировать SQL в Telegram

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