Menu
Coddy logo textTech

Обход иерархии

Часть раздела Продвинутый уровень путешествия по 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 ничего не сопоставляет).

challenge icon

Задание

Средне

Доступные таблицы и столбцы:

  • 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Продвинутый уровень

Потренируйтесь самостоятельно: Песочница SQL