SQL: INTERSECT и EXCEPT — Покупатели обеих категорий

Практическая задача по SQL на тему «INTERSECT и EXCEPT». В условии приведены схема таблиц, ограничения данных, имена столбцов результата и порядок сортировки. Напишите один SELECT или WITH-запрос для SQLite. Перед проверкой продумайте пустой результат, повторяющиеся строки и границы диапазонов, если они встречаются в условии. Проверяется результат запроса, поэтому допустима эквивалентная реализация. Сначала решите задачу самостоятельно; продолжение практики доступно в полном курсе продвинутого SQL.

Покупатели обеих категорий

Что уже дано

Уже заполнена orders(order_id INTEGER PRIMARY KEY,client_id INTEGER NOT NULL,category TEXT NOT NULL). Все ID положительные INTEGER, order_id уникален. category принимает строго electronics, books, clothing. В каждой таблице от 0 до 1000 строк, NULL нет. Один идентификатор может иметь много самостоятельных фактов одной категории. Сравнение текстовых значений BINARY, регистр значим.

Что нужно сделать

Найдите уникальные client_id клиентов, имевших хотя бы один electronics-заказ и хотя бы один books-заказ. clothing не помогает выполнить ни одно из двух требований. Отработайте INTERSECT над списками идентификаторов. Число повторных фактов не влияет на количество строк идентификатора в результате.

Ввод и вывод

Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 1 столбцов в указанном порядке и с этими именами: client_id. client_id — INTEGER без NULL. Сортировка: client_id ASC. При отсутствии подходящих идентификаторов результат пустой. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.

Пример

Подготовка данных
INSERT INTO orders VALUES (1,10,'electronics'),(2,10,'electronics'),(3,10,'books'),(4,20,'electronics'),(5,30,'books'),(6,40,'clothing');
Вывод
10
РешениеSQL · SQLite

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи