SQL: Реляционное деление: условия «для всех» — Клиенты, купившие все обязательные товары
Практическая задача по SQL на тему «Реляционное деление: условия «для всех»». В условии приведены схема таблиц, ограничения данных, имена столбцов результата и порядок сортировки. Напишите один SELECT или WITH-запрос для SQLite. Перед проверкой продумайте пустой результат, повторяющиеся строки и границы диапазонов, если они встречаются в условии. Проверяется результат запроса, поэтому допустима эквивалентная реализация. Сначала решите задачу самостоятельно; продолжение практики доступно в полном курсе продвинутого SQL.
Клиенты, купившие все обязательные товары
Что уже дано
Уже заполнены clients(client_id INTEGER PRIMARY KEY,name TEXT NOT NULL), mandatory_items(item_id INTEGER PRIMARY KEY) и orders(order_id INTEGER PRIMARY KEY,client_id INTEGER NOT NULL,item_id INTEGER NOT NULL). Все идентификаторы — положительные INTEGER без NULL. Первичные ключи уникальны. Факт может ссылаться на отсутствующего кандидата или на элемент вне обязательного справочника. Повторные факты одного кандидата и элемента разрешены. Имена могут повторяться, не содержат | и перевода строки. В каждой таблице от 0 до 1000 строк.
Что нужно сделать
Найдите клиентов, купивших каждый товар из mandatory_items. Посторонние покупки не помогают покрыть требования и не мешают подходящему клиенту. Повтор одной покупки не заменяет отсутствующий обязательный товар. Если обязательный справочник пуст, включите всех клиентов, даже без покупок. Используйте два NOT EXISTS.
Ввод и вывод
Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 2 столбцов в указанном порядке и с этими именами: client_id, name. client_id — INTEGER, name — исходный TEXT; NULL в выводе нет. Сортировка: client_id ASC. Одна строка на подходящего кандидата; при отсутствии таких кандидатов результат пустой. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.
Пример
- Подготовка данных
INSERT INTO clients VALUES (1,'A'),(2,'B'),(3,'C'),(4,'D'); INSERT INTO mandatory_items VALUES (10),(20); INSERT INTO orders VALUES (1,1,10),(2,1,20),(3,1,10),(4,1,99),(5,1,99),(6,2,10),(7,2,10),(8,3,10),(9,3,99);
- Вывод
1|A
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- SQL: Агрегация, оконные вычисления и фильтрация — Категории-лидеры и доля в продажах
- SQL: SELF JOIN и поиск уникальных пар — Пары с несколькими общими проектами
- SQL: Календарная таблица и пропущенные даты — Непрерывный отчёт о звонках
- SQL: Объединение перекрывающихся интервалов — Объединённая занятость внутри отчётного окна
- SQL: Подсчёт одновременно активных интервалов — Максимальное число занятых столов
- SQL: EXPLAIN QUERY PLAN в SQLite — Сводка ошибок и их доля по сервисам
