Обход иерархии
Часть раздела Продвинутый уровень путешествия по SQL на Coddy. Урок 21 из 27.
Настоящая причина существования рекурсивных CTE: обход связи parent/child, хранящейся в одной таблице. Предположим, что в employees есть столбец manager_id, который указывает обратно на ту же таблицу:
WITH RECURSIVE chain AS (
SELECT id, name, manager_id
FROM employees WHERE id = 7 -- якорь: начальный сотрудник
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employees e
JOIN chain c ON e.id = c.manager_id -- рекурсия: переход к менеджеру
)
SELECT * FROM chainНа каждом шаге CTE снова объединяется с employees, поднимаясь на один уровень вверх по дереву. Рекурсия естественным образом останавливается, когда у row нет manager (JOIN ничего не сопоставляет).
Задание
СреднеДоступные таблицы и столбцы:
categories:id,name,parent_id
У каждой категории есть необязательный parent_id, указывающий на другую категорию. Верните все категории, являющиеся потомками категории id = 1 (её дочерние категории, внуки и т. д.), но не саму категорию 1. Верните id и name, упорядочив результаты по id.
Попробуйте сами
WITH RECURSIVE descendants AS (
-- якорь: прямые потомки id 1
-- рекурсия: их потомки и т.д.
)
SELECT id, name FROM descendants ORDER BY id
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Продвинутый уровень
Потренируйтесь самостоятельно: Песочница SQL