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

使用递归CTE实现SQL Server员工层级查询遇阻求助

解决SQL Server递归CTE生成层级链的问题

你的代码核心问题出在递归部分的层级链拼接逻辑,没有复用CTE中已经生成的完整上级链,导致只能生成两级关联,无法处理更深的层级。另外还有一些冗余的判断可以简化,下面是修正后的方案:

问题分析

  1. 拼接逻辑错误:原代码中用manager.Name +'->' + emp.Name生成tree,这只会拼接当前员工和直接主管的名字,无法继承主管以上的完整层级链。正确的做法应该是复用CTE中主管的tree字段,再追加当前员工的名字。
  2. 冗余CASE判断:递归部分关联的是manager.ID = emp.Supervisor,而根节点的Supervisor是0,不会进入递归分支,所以CASE判断完全没必要。
  3. 数据类型匹配(可选):如果ID和Supervisor是数值类型,建议去掉引号直接用0,避免隐式转换。

修正后的代码

WITH CTE AS (
    -- 基准查询:根节点(无上级的员工)
    SELECT 
        ID, 
        Name, 
        Supervisor,
        Name AS tree
    FROM employee 
    WHERE Supervisor = 0  -- 如果字段是字符串类型则用'0'
    UNION ALL 
    -- 递归查询:关联上级节点,累积层级链
    SELECT 
        emp.ID, 
        emp.Name,
        emp.Supervisor,
        manager.tree + ' -> ' + emp.Name AS tree
    FROM employee emp
    INNER JOIN CTE manager
        ON manager.ID = emp.Supervisor 
)
SELECT ID, Name, Supervisor, tree
FROM CTE
ORDER BY ID;

效果示例

运行后你会得到符合预期的层级链:

  • ID=2的记录:Heinz Griesser -> Andreas Sitter
  • ID=5的记录:Heinz Griesser -> Hannes Berg -> Anna Kruggel
  • ID=11的记录:Heinz Griesser -> Andrea Sternig -> Dominik Kainzner

这样就能正确生成从根节点到当前员工的完整层级链了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:05:34