使用递归CTE实现SQL Server员工层级查询遇阻求助
解决SQL Server递归CTE生成层级链的问题
你的代码核心问题出在递归部分的层级链拼接逻辑,没有复用CTE中已经生成的完整上级链,导致只能生成两级关联,无法处理更深的层级。另外还有一些冗余的判断可以简化,下面是修正后的方案:
问题分析
- 拼接逻辑错误:原代码中用
manager.Name +'->' + emp.Name生成tree,这只会拼接当前员工和直接主管的名字,无法继承主管以上的完整层级链。正确的做法应该是复用CTE中主管的tree字段,再追加当前员工的名字。 - 冗余CASE判断:递归部分关联的是
manager.ID = emp.Supervisor,而根节点的Supervisor是0,不会进入递归分支,所以CASE判断完全没必要。 - 数据类型匹配(可选):如果
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
相关产品推荐
相关产品推荐

