SQL: Расчёт состава изделия рекурсивным запросом — Полная потребность в узлах и общих деталях

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

Полная потребность в узлах и общих деталях

Что уже дано

Таблица bom(parent_id INTEGER NOT NULL, child_id INTEGER NOT NULL, quantity INTEGER NOT NULL, PRIMARY KEY(parent_id,child_id)). Не более 8 различных ID — положительных целых до 1000000. quantity — целое от 1 до 20 на одну единицу родителя. Циклы и самопетли допустимы; одинаковые пары рёбер не повторяются. Изделие 100 является заданным стартом даже без исходящих связей.

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

Рассчитайте суммарную потребность во всех узлах и деталях для выпуска 5 единиц изделия 100. Каждый путь перемножает число изделий и нормы связей. При появлении уже посещённого ID не продолжайте этот переход; разные простые пути к общей детали учитывайте отдельно. Верните по одной строке на каждого достигнутого потомка, включая промежуточные сборки. total_quantity — сумма потребностей по всем путям. Само изделие 100 не выводите.

Ввод и вывод

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

Пример

Подготовка данных
INSERT INTO bom VALUES (100,10,2),(100,20,3),(10,1,4),(20,1,5),(20,3,2);
Вывод
1|115
3|30
10|10
20|15
РешениеSQL · SQLite

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

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

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