0Pricing
SQL Interview Prep · 课时

遍历组织架构图

遍历员工与经理的层级关系,直到任意深度

遍历组织架构图 是 CoddyKit 上的免费 SQL Interview Prep 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Interview Prep 课程共包含 4 节课。

组织架构图问题

“给定一张包含 id、name 和 manager_id 的 employees 表,列出指定经理下属的所有人员,深度不限。”这是递归 CTE 面试题中最常见的一类。

该表是自引用的:manager_id 指向另一行的 id。在本课中,您将分别向下(查找下属)和向上(查找汇报链)遍历这张表。

示例表

请设想以下数据。CEO 的经理字段为 NULL,其他人都沿着汇报链向上汇报。

  • 1 Ada(经理为 NULL)
  • 2 Ben(经理为 1)
  • 3 Cleo(经理为 1)
  • 4 Dan(经理为 2)
  • 5 Eve(经理为 4)

因此,深度链路是:Ada → Ben → Dan → Eve。遍历时请记住这一点。

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    manager_id INT REFERENCES employees(id)
);

从经理开始向下遍历

要列出指定经理下属的所有人员,锚点可以选择该经理(或其直接下属),递归成员则沿着 manager_id 向下遍历。

这里从 Ben(标识符 2)开始,收集其下属的所有人员。

WITH RECURSIVE subtree AS (
    SELECT id, name, manager_id, 1 AS depth
    FROM employees WHERE id = 2
    UNION ALL
    SELECT e.id, e.name, e.manager_id, s.depth + 1
    FROM employees e
    JOIN subtree s ON e.manager_id = s.id
)
SELECT name, depth FROM subtree ORDER BY depth;

读取输出结果

上面的查询返回深度为 1 的 Ben、深度为 2 的 Dan 和深度为 3 的 Eve。锚点以 Ben 为种子;第一次迭代找到 Dan(其经理是 Ben);第二次迭代找到 Eve(其经理是 Dan);第三次迭代没有找到任何人,因此递归停止。

如果面试官问“Eve 位于 Ben 下方多少层?”,depth 列可以直接回答:3 减 1 等于 2 层。

向上遍历到 CEO

反向问题同样常见:“显示 Eve 直到 CEO 的完整汇报链。”只需反转连接方向 — 递归成员现在沿着当前行的 manager_id 向上找到父级。

WITH RECURSIVE chain AS (
    SELECT id, name, manager_id, 1 AS lvl
    FROM employees WHERE id = 5
    UNION ALL
    SELECT e.id, e.name, e.manager_id, c.lvl + 1
    FROM employees e
    JOIN chain c ON e.id = c.manager_id
)
SELECT name, lvl FROM chain ORDER BY lvl;

向下与向上:连接方向相反

向下遍历和向上遍历之间唯一的结构差异,就是连接条件:

  • 向下(查找下属): e.manager_id = cte.id — 匹配经理是我们已有行的员工。
  • 向上(查找经理): e.id = cte.manager_id — 匹配其标识符是当前行经理的员工。

能够清楚地说明这种方向变化,会给面试官留下很好的印象。

构建缩进树

更完善的答案会使用 depth 重复空格,将输出格式化为缩进树。这表明您不仅会计算层级结果,还能展示层级结果。

WITH RECURSIVE org AS (
    SELECT id, name, 1 AS depth
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT REPEAT('  ', depth - 1) || name AS tree
FROM org
ORDER BY depth;

累积路径

要显示从 CEO 到每个人的完整路线,请携带一个 path 字符串。这与上一课中的技术相同,只是应用到了组织架构图上。

WITH RECURSIVE org AS (
    SELECT id, name, CAST(name AS VARCHAR(500)) AS path
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, o.path || ' / ' || e.name
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, path FROM org ORDER BY path;

统计每位经理的下属人数

一个常见的追问是:“每位经理有多少名直接或间接汇报的人员?”请为每位经理递归构建其子树,然后进行聚合。常见模式是针对每个根节点运行一次递归,并按种子经理执行 GROUP BY。

这里通过遍历整棵树,统计 Ada(CEO)之下的行数,从而计算她的所有间接下属。

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 0 AS depth
    FROM employees WHERE id = 1
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT COUNT(*) - 1 AS total_reports FROM org;

常见错误

请注意面试官设置的以下陷阱:

  • 连接方向错误 — 如果本来要向上遍历,却使用 e.manager_id = cte.id,就会返回错误的集合。
  • 忘记锚点筛选条件 — 省略 WHERE id = X 会将每一行都作为种子,从而返回整片森林。
  • 深度偏移一位 — 请决定种子是深度 0 还是 1,并始终保持一致。

为什么不直接使用自连接

自连接可以获取固定数量的层级:一次连接获取直接下属,两次连接获取隔级下属,以此类推。但您必须提前知道深度,并为每一层编写一个连接。

递归 CTE 可以在一个查询中处理任意且未知的深度。当面试官说“层级可能有任意数量的层”时,这就排除了普通自连接,并提示您应该使用递归。

快速检查

请确保您能够切换遍历方向。

回顾

组织架构遍历是应用于自引用表的递归骨架:

  • 向下:以一位经理为起点,连接 e.manager_id = cte.id。
  • 向上:以一名员工为起点,连接 e.id = cte.manager_id。
  • 使用 depth 记录缩进,使用 path 记录完整链路。
  • 递归可以处理任意未知深度,而自连接无法做到这一点。

接下来:使用递归生成数字序列和日期序列。

常见问题解答

「遍历组织架构图」课时是免费的吗?

是的 — 「遍历组织架构图」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 SQL Interview Prep 课程共包含 4 节课。

「遍历组织架构图」这节课中我会学到什么?

遍历员工与经理的层级关系,直到任意深度 你通过在浏览器中直接运行的动手代码来练习 SQL Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Interview Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「遍历组织架构图」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Interview Prep 课中编写并运行代码吗?

能。每节 SQL Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 锚成员与递归成员
  2. 遍历组织架构图
  3. 生成数字和日期序列
  4. 避免无限递归
← 返回 SQL Interview Prep