使用SQL Server递归查询获取指定节点的父节点与同级节点
用SQL Server递归CTE实现指定节点的父节点及同级节点查询
原表结构与数据
| Id | ParentId |
|---|---|
| 1 | NULL |
| 2 | 1 |
| 3 | 1 |
| 4 | NULL |
| 5 | 4 |
| 6 | 8 |
| 7 | 9 |
预期结果(指定Id=2时)
| Id | ParentId |
|---|---|
| 1 | NULL |
| 2 | 1 |
| 3 | 1 |
递归CTE解决方案
直接使用递归公共表表达式(CTE)可以简化查询,只需修改目标节点ID即可快速复用,代码如下:
DECLARE @TargetId INT = 2; -- 替换为需要查询的目标子节点ID WITH NodeInfo AS ( -- 锚点:定位目标节点,获取其ParentId作为匹配基准 SELECT Id, ParentId, ParentId AS TargetParent FROM MyTable WHERE Id = @TargetId UNION ALL -- 递归:获取父节点和所有同级节点 SELECT t.Id, t.ParentId, ni.TargetParent FROM MyTable t JOIN NodeInfo ni ON t.Id = ni.ParentId -- 匹配目标节点的父节点 OR t.ParentId = ni.TargetParent -- 匹配所有和目标节点同属一个父节点的同级节点 ) -- 去重并排序输出 SELECT DISTINCT Id, ParentId FROM NodeInfo ORDER BY Id;
代码说明
- 锚点查询:先定位目标节点,记录它的父节点
TargetParent,这是后续匹配的核心基准。 - 递归关联:通过JOIN同时找到父节点(目标节点的ParentId对应的记录)和所有同级节点(ParentId等于
TargetParent的所有记录)。 - 去重处理:递归过程中可能会重复获取节点,用
DISTINCT保证结果唯一,最后按Id排序让结果更规整。
这个写法相比嵌套子查询更灵活,后续查询不同节点时只需修改@TargetId的值即可,维护和扩展都更方便。
内容的提问来源于stack exchange,提问作者Manta
相关产品推荐
相关产品推荐

