Menu
CoddyTech

遍历层级结构

本课属于 Coddy SQL 学习旅程的“进阶内容”单元。第 21 课,共 27 课。

递归 CTE 存在的真正原因:遍历存储在单个表中的父级/子级关系。假设 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 连接起来,沿着树向上移动一层。当某一行没有经理时,递归会自然停止(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 在线编辑器