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

使用SQL Server递归查询获取指定节点的父节点与同级节点

用SQL Server递归CTE实现指定节点的父节点及同级节点查询

原表结构与数据

IdParentId
1NULL
21
31
4NULL
54
68
79

预期结果(指定Id=2时)

IdParentId
1NULL
21
31

递归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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 19:12:46