基于CTE的团队层级查询:多管理者场景下获取B的下属层级
多管理者场景下的员工层级查询解决方案
原代码问题分析
你的CTE代码未生效主要有三个原因:
- 字段名不匹配:原表字段为
employee和manager,但代码中错误使用了emp、mang这类不存在的字段名。 - 递归逻辑错误:递归查询下属时,关联条件写反了——应该用当前层级的员工作为管理者,关联表中
manager字段匹配的记录,而非反过来。 - 未处理重复员工:由于存在多管理者场景(比如E同时归C和D管理),同一员工会被多次递归命中,需要去重避免重复输出。
修正后的层级查询代码
先获取包含每个员工层级的完整数据:
WITH hierarchy AS ( -- 初始节点:目标管理者B,层级为1 SELECT employee, 1 AS lvl FROM hrc WHERE employee = 'B' UNION ALL -- 递归获取下属:以上一层级的员工为管理者,关联其直接下属 SELECT t.employee, h.lvl + 1 AS lvl FROM hierarchy h JOIN hrc t ON h.employee = t.manager -- 去重:避免同一员工因多管理者被重复加入 WHERE NOT EXISTS ( SELECT 1 FROM hierarchy h2 WHERE h2.employee = t.employee ) ) SELECT * FROM hierarchy ORDER BY lvl, employee;
如果需要按层级聚合得到你预期的B > C、D > E、F > G、H格式,可以使用以下代码:
WITH hierarchy AS ( SELECT employee, 1 AS lvl FROM hrc WHERE employee = 'B' UNION ALL SELECT t.employee, h.lvl + 1 AS lvl FROM hierarchy h JOIN hrc t ON h.employee = t.manager WHERE NOT EXISTS ( SELECT 1 FROM hierarchy h2 WHERE h2.employee = t.employee ) ) SELECT GROUP_CONCAT(DISTINCT employee ORDER BY employee SEPARATOR '、') AS 层级员工, lvl FROM hierarchy GROUP BY lvl ORDER BY lvl;
代码说明
- 初始查询:定位到管理者B,将其层级设为1,作为递归的起点。
- 递归关联:通过
h.employee = t.manager关联,获取上一层级员工的所有直接下属,并将层级加1。 - 去重逻辑:
NOT EXISTS子句确保同一员工只会被加入递归结果一次,避免重复。 - 层级聚合:使用
GROUP_CONCAT按层级分组拼接员工名称,得到你需要的层级链格式。
输出结果
执行聚合代码后,会得到以下结果:
| 层级员工 | lvl |
|---|---|
| B | 1 |
| C、D | 2 |
| E、F | 3 |
| G、H | 4 |
对应层级链:B > C、D > E、F > G、H
内容的提问来源于stack exchange,提问作者EdG
相关产品推荐
相关产品推荐

