如何编写SQL自连接查询实现员工层级经理阶梯式展示
解决方案:构建员工层级经理字段
原始员工表
| emp_id | emp | level | manager_id | manager |
|---|---|---|---|---|
| 100 | sam | 1 | 100 | sam |
| 200 | jack | 2 | 100 | sam |
| 300 | jill | 2 | 100 | sam |
| 400 | claire | 3 | 200 | jack |
| 500 | reed | 3 | 300 | jill |
| 600 | derrick | 4 | 400 | claire |
| 700 | bill | 4 | 500 | reed |
需求说明
需要为每个员工生成l1-l4字段,规则如下:
l1:组织最高层级(level 1)的经理姓名l2:员工的直属上一级经理(仅当员工层级≥3时填充)l3:员工的上上级经理(仅当员工层级=4时填充)l4:当前最高层级为4,所有记录均为NULL
实现方法
方法1:多次自连接(适合固定少量层级)
逻辑直观,适合层级数量明确且较少的场景:
SELECT e.emp_id, e.emp, e.level, e.manager_id, e.manager, -- level≥2时,l1为最高层经理 CASE WHEN e.level >= 2 THEN l1.emp ELSE NULL END AS l1, -- level≥3时,l2为直属上一级经理 CASE WHEN e.level >= 3 THEN e.manager ELSE NULL END AS l2, -- level=4时,l3为直属上一级经理 CASE WHEN e.level = 4 THEN e.manager ELSE NULL END AS l3, NULL AS l4 FROM employees e LEFT JOIN employees l1 ON e.manager_id = l1.emp_id AND l1.level = 1 ORDER BY e.emp_id;
方法2:递归CTE(适合层级不固定的场景)
扩展性更强,可自动适配后续新增的层级:
WITH RECURSIVE emp_hierarchy AS ( -- 起始节点:最高层级员工 SELECT emp_id, emp, level, manager_id, manager, CAST(NULL AS VARCHAR(50)) AS l1, CAST(NULL AS VARCHAR(50)) AS l2, CAST(NULL AS VARCHAR(50)) AS l3, CAST(NULL AS VARCHAR(50)) AS l4 FROM employees WHERE level = 1 UNION ALL -- 递归遍历下一层级员工 SELECT e.emp_id, e.emp, e.level, e.manager_id, e.manager, CASE WHEN e.level = 2 THEN h.emp ELSE h.l1 END, CASE WHEN e.level = 3 THEN e.manager ELSE h.l2 END, CASE WHEN e.level = 4 THEN e.manager ELSE h.l3 END, h.l4 FROM employees e JOIN emp_hierarchy h ON e.manager_id = h.emp_id ) SELECT * FROM emp_hierarchy ORDER BY emp_id;
最终结果
执行上述任一SQL后,将得到如下目标表:
| emp_id | emp | level | manager_id | manager | l1 | l2 | l3 | l4 |
|---|---|---|---|---|---|---|---|---|
| 100 | sam | 1 | 100 | sam | NULL | NULL | NULL | NULL |
| 200 | jack | 2 | 100 | sam | sam | NULL | NULL | NULL |
| 300 | jill | 2 | 100 | sam | sam | NULL | NULL | NULL |
| 400 | claire | 3 | 200 | jack | sam | jack | NULL | NULL |
| 500 | reed | 3 | 300 | jill | sam | jill | NULL | NULL |
| 600 | derrick | 4 | 400 | claire | sam | jack | claire | NULL |
| 700 | bill | 4 | 500 | reed | sam | jill | reed | NULL |
内容的提问来源于stack exchange,提问作者User277883
相关产品推荐
相关产品推荐

