MS SQL 2012层级表:获取每行层级数的SQL实现问询
计算SQL Server树形结构的层级编号
针对你给出的树形结构数据,在SQL Server 2012中可以通过**递归CTE(Common Table Expression)**轻松获取每行的层级编号,这也是处理这类树形层级问题的标准方案。下面是具体实现步骤:
1. 模拟原始测试数据
先创建测试表并插入你提供的数据,方便后续验证:
CREATE TABLE TestHierarchy ( ID INT PRIMARY KEY, Name VARCHAR(10), Parent INT ); INSERT INTO TestHierarchy (ID, Name, Parent) VALUES (1, 'Test1', NULL), (2, 'Test2', NULL), (3, 'Test3', 1), (4, 'Test4', 3), (5, 'Test5', 2), (6, 'Test6', 4), (7, 'Test7', 3);
2. 递归CTE查询实现层级计算
递归CTE分为两个核心部分:
- 锚点成员:筛选所有根节点(
Parent为NULL的记录),并将它们的层级设为0 - 递归成员:通过关联父节点ID,逐层遍历子节点,每往下一层层级数加1
具体查询代码如下:
WITH HierarchyCTE AS ( -- 锚点成员:定义根节点的层级为0 SELECT ID, Name, Parent, 0 AS Level FROM TestHierarchy WHERE Parent IS NULL UNION ALL -- 递归成员:关联父节点,层级递加1 SELECT th.ID, th.Name, th.Parent, hcte.Level + 1 AS Level FROM TestHierarchy th INNER JOIN HierarchyCTE hcte ON th.Parent = hcte.ID ) SELECT ID, Name, Parent, Level FROM HierarchyCTE ORDER BY ID; -- 按ID排序匹配你的期望输出格式
3. 最终查询结果
执行上述代码后,会得到完全符合你需求的输出:
| ID | Name | Parent | Level |
|---|---|---|---|
| 1 | Test1 | NULL | 0 |
| 2 | Test2 | NULL | 0 |
| 3 | Test3 | 1 | 1 |
| 4 | Test4 | 3 | 2 |
| 5 | Test5 | 2 | 1 |
| 6 | Test6 | 4 | 3 |
| 7 | Test7 | 3 | 2 |
这个方案完全适配SQL Server 2012的语法,对于常规规模的树形数据集,性能表现也足够稳定。
内容的提问来源于stack exchange,提问作者Sandeep Thomas
相关产品推荐
相关产品推荐

