遍历层级结构
本课属于 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 不匹配任何内容)。
挑战
中等可用的表和列:
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 在线编辑器