SQL: Обход дерева: глубина и путь — Пути, корни и листья всего каталога

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

Пути, корни и листья всего каталога

Что уже дано

Таблица categories(category_id INTEGER PRIMARY KEY, parent_id INTEGER, name TEXT NOT NULL). До 100 категорий, ID положительные. Это ациклический лес: parent_id либо NULL, либо ID существующего родителя; у каждого узла не более одного родителя. Имена непустые, без символа /, но имена разных узлов могут совпадать.

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

Обойдите весь лес и верните каждую категорию ровно один раз. depth — число рёбер от её корня: у корня0. path — имена от корня до категории через строку « / », без начального разделителя. root_id — идентификатор корня именно этого дерева. is_leaf равен1, если категория не имеет дочерних узлов, иначе0. Одиночный корень имеет depth0, root_id равный собственному ID и is_leaf1.

Ввод и вывод

Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 5 столбцов в указанном порядке и с этими именами: category_id, depth, path, root_id, is_leaf. ID, depth и is_leaf — INTEGER; path — TEXT; NULL нет. Сортировка: path ASC COLLATE BINARY, category_id ASC. Пустая таблица даёт пустой результат. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.

Пример

Подготовка данных
INSERT INTO categories VALUES (1,NULL,'Каталог'),(2,1,'Техника'),(3,2,'Телефоны'),(4,1,'Мебель'),(8,NULL,'Услуги'),(9,8,'Ремонт');
Вывод
1|0|Каталог|1|0
4|1|Каталог / Мебель|1|1
2|1|Каталог / Техника|1|0
3|2|Каталог / Техника / Телефоны|1|1
8|0|Услуги|8|0
9|1|Услуги / Ремонт|8|1
РешениеSQL · SQLite

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

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

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