如何编写SQL查询指定员工的全层级上级主管列表?
递归查询员工所有上级主管的SQL方案
嘿,我来帮你搞定这个层级查询的需求!要获取某个员工的所有上级(从直属主管到最高层领导),咱们得用**递归CTE(公共表表达式)**来处理这种嵌套的上下级关系,这是最适合的方案了。
完整SQL查询语句
假设你的Employee表包含employee_id(员工ID)、manager_id(直属上级ID)字段,Department表用来关联(如果不需要部门信息可以直接去掉关联逻辑),完整的递归查询语句如下:
WITH RECURSIVE emp_hierarchy AS ( -- 锚点成员:先定位目标员工的直属上级,作为递归起点 SELECT e.manager_id AS supervisor FROM employee e JOIN department d ON e.department_id = d.department_id -- 不需要部门关联可删除此行 WHERE e.employee_id = 202 -- 替换为你要查询的目标员工ID UNION ALL -- 递归成员:循环查找上级的上级,直到没有更高层主管为止 SELECT e.manager_id AS supervisor FROM employee e JOIN emp_hierarchy eh ON e.employee_id = eh.supervisor WHERE e.manager_id IS NOT NULL ) -- 最终输出所有层级的上级主管 SELECT supervisor FROM emp_hierarchy;
语句细节解释
- WITH RECURSIVE:这是递归CTE的核心关键字,主流数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle 12c+)都支持这个语法
- 锚点成员:第一步先找到目标员工的直属上级,作为整个递归查询的起始点
- UNION ALL:用来连接锚点结果和递归结果,确保所有层级的上级记录都被收集
- 递归成员:把上一轮查到的上级当作当前员工,继续向上查找他的主管,直到某个主管没有更高层领导(
manager_id IS NULL)时停止递归
示例结果
当你查询员工ID=202时,返回的结果会和你预期的一致:
| supervisor |
|---|
| 200 |
| 130 |
简化版(无需关联部门表)
如果你的Employee表本身已经包含了所有上下级关系,不需要依赖Department表的话,可以直接简化成下面的版本:
WITH RECURSIVE emp_hierarchy AS ( SELECT manager_id AS supervisor FROM employee WHERE employee_id = 202 UNION ALL SELECT e.manager_id AS supervisor FROM employee e JOIN emp_hierarchy eh ON e.employee_id = eh.supervisor WHERE e.manager_id IS NOT NULL ) SELECT supervisor FROM emp_hierarchy;
内容的提问来源于stack exchange,提问作者param trivedi
相关产品推荐
相关产品推荐

