Oracle SQL Developer中如何按层级排序展示员工汇报结构
员工上下级汇报结构查询实现方案
这个场景属于典型的组织架构递归层级查询,核心通过递归遍历员工与直属经理的关联关系,生成带层级缩进的结构化结果,具体实现方式如下:
核心实现逻辑
- 定位根节点:首先找到组织架构最高层人员,这类人员的
manager_code通常满足以下任一特征:值为NULL、与自身employee_code相等、不存在于employee_code列中(为虚拟顶层节点编码) - 递归遍历关联:从根节点出发,逐轮匹配直属下属(即
manager_code等于当前节点employee_code的记录),同时记录当前节点的层级深度、完整汇报链路、带缩进的展示文本 - 排序输出:按完整汇报链路排序,保证同一上级的下属连续展示,层级从上到下顺序正确
通用代码示例
以下写法适用于所有支持递归CTE的数据库(包括MySQL 8.0+、PostgreSQL、SQL Server、Oracle 11gR2+、BigQuery等),可根据实际业务调整判断规则:
WITH RECURSIVE org_structure AS ( -- 锚点查询:拉取顶层根节点 SELECT employee_code, manager_code, 1 AS level, CAST(employee_code AS CHAR(500)) AS report_path, CAST(employee_code AS CHAR(500)) AS display_name FROM emp_mgr_relation -- 根节点判断条件,根据实际数据修改:如果顶层manager为空就用IS NULL,如果是自管就改成manager_code = employee_code WHERE manager_code IS NULL UNION ALL -- 递归查询:逐层拉取下属 SELECT e.employee_code, e.manager_code, os.level + 1 AS level, CONCAT(os.report_path, '>', e.employee_code) AS report_path, CONCAT(REPEAT(' ', os.level), '└── ', e.employee_code) AS display_name FROM emp_mgr_relation e INNER JOIN org_structure os ON e.manager_code = os.employee_code ) SELECT display_name AS 汇报层级展示, employee_code AS 员工编码, manager_code AS 直属经理编码, level AS 层级深度, report_path AS 完整汇报路径 FROM org_structure ORDER BY report_path;
适配调整说明
- 缩进样式调整:如果需要匹配预期输出的前缀格式,修改
REPEAT函数里的填充字符、层级连接符即可,比如把空格替换成-就能生成短横线缩进的效果 - 老版本数据库兼容:如果使用不支持递归CTE的老版本数据库(比如MySQL 5.x),可以通过存储过程循环遍历层级生成结果,也可以在业务侧提前维护好每个员工的
level、report_path字段,数据变更时同步更新,查询时直接按路径排序即可 - 异常数据处理:如果存在循环汇报(比如A的上级是B,B的上级是A)的脏数据,可以在递归时增加路径重复判断,避免死循环
参考示例
输入数据集

预期输出效果

内容的提问来源于stack exchange,提问作者user19384928
相关产品推荐
相关产品推荐

