求助:MS SQL层级名称的递归查询实现方案
用MS SQL递归CTE实现层级名称拼接
嗨,刚接触MS SQL的话,这种层级路径拼接的需求用**递归CTE(公用表表达式)**来实现最适合不过了,刚好你的数据是标准的树形结构,直接上解决方案:
首先假设你的表名为YourTable(记得替换成你实际的表名),执行下面的SQL就能得到你想要的结果:
WITH HierarchicalCTE AS ( -- 锚点成员:选取最顶层的节点(Parent ID = 0) SELECT ID, Name, [Parent ID] AS ParentID, CAST(Name AS VARCHAR(MAX)) AS [层级名称] FROM YourTable WHERE [Parent ID] = 0 UNION ALL -- 递归成员:逐层拼接父节点的层级名称 SELECT t.ID, t.Name, t.[Parent ID] AS ParentID, CAST(c.[层级名称] + '.' + t.Name AS VARCHAR(MAX)) AS [层级名称] FROM YourTable t INNER JOIN HierarchicalCTE c ON t.[Parent ID] = c.ID ) SELECT ID, Name, ParentID AS [Parent ID], [层级名称] FROM HierarchicalCTE ORDER BY ID;
代码简单解释:
- 锚点成员:先把所有根节点(
Parent ID = 0)筛选出来,它们的层级名称就是自身的Name,毕竟没有父节点可以拼接。 - 递归成员:通过关联当前节点和它的父节点(来自CTE的上一层结果),把父节点的完整层级路径和当前节点的
Name用.连接,形成新的层级名称。 - 最后从CTE中取出所有字段并按
ID排序,就能得到你期望的结果格式了。
拿你提供的测试数据跑一遍,完全能输出你要的层级名称效果~
内容的提问来源于stack exchange,提问作者P Kumar
相关产品推荐
相关产品推荐

