You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL实现员工各管理层级对应多行结果(基于AdventureWorksDW2014)

解决方案:生成员工各管理层级的多行记录

要实现每位员工在其管理结构的每个层级生成一行记录,可通过**递归CTE(公共表表达式)**向上遍历员工的管理链,每遍历一个层级就生成一条对应记录。以下是基于AdventureWorksDW2014的[dbo].[DimEmployee]表的具体实现:

完整SQL查询

WITH EmployeeHierarchy AS (
    -- 锚点成员:初始化每个员工的第一行(层级1,经理为员工自身)
    SELECT 
        e.EmployeeKey AS EmployeeID,
        CONCAT(e.FirstName, ' ', e.LastName) AS EmployeeName,
        e.EmployeeKey AS ManagerID,
        CONCAT(e.FirstName, ' ', e.LastName) AS ManagerName,
        1 AS HierarchyLevel
    FROM [dbo].[DimEmployee] e

    UNION ALL

    -- 递归成员:向上遍历上级经理,生成对应层级的记录
    SELECT 
        eh.EmployeeID,
        eh.EmployeeName,
        e.EmployeeKey AS ManagerID,
        CONCAT(e.FirstName, ' ', e.LastName) AS ManagerName,
        eh.HierarchyLevel + 1 AS HierarchyLevel
    FROM EmployeeHierarchy eh
    JOIN [dbo].[DimEmployee] e 
        ON eh.ManagerID = e.ParentEmployeeKey
)
-- 输出最终结果,按员工ID和层级排序
SELECT 
    EmployeeName,
    ManagerName,
    HierarchyLevel
FROM EmployeeHierarchy
ORDER BY EmployeeID, HierarchyLevel;

逻辑说明

  • 锚点成员:为每个员工生成初始行,标记为层级1,此时经理为员工自身。
  • 递归成员:通过ParentEmployeeKey关联当前记录的经理的上级,层级数加1,生成新的记录,直到遍历到无上级的最高管理层(递归自动终止)。
  • 结果输出:每个员工会生成与自身管理链层数相等的记录,例如5级员工会显示5行,每行对应管理链中的一个层级,包含员工姓名、对应层级的经理姓名及层级编号。

注意事项

  • 若员工无上级(如企业最高管理者),递归仅执行一次,仅生成1行记录。
  • 可根据需求调整层级计数逻辑(例如将最高管理层设为层级1),只需修改锚点成员的初始层级值和递归方向即可。

内容的提问来源于stack exchange,提问作者Richard D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:25:11