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

求助:SQL Server递归查询实现节点完整路径拼接

修正SQL Server递归路径拼接问题

我来帮你搞定这个递归路径拼接的问题!你的原SQL主要是递归CTE的关联逻辑搞反了,而且没有针对每个节点追踪完整的父链路径,所以才会出现大量重复值的拼接结果。

问题分析

原SQL的递归部分使用了a.item = b.parentItem,这会错误地将父节点和子节点的关联方向反转,导致生成大量重复的节点记录;同时你没有在递归过程中累积每个节点的专属路径,最终拼接时就会把所有节点的value重复叠加。

正确解决方案

我们需要通过递归CTE从每个节点向上遍历父节点,逐步累积从最顶层父节点到当前节点的路径,最后筛选出每个节点的完整路径记录:

-- 先创建测试表(替换为你的实际表名)
CREATE TABLE YourTable (
    item INT,
    value VARCHAR(50),
    parentItem INT
);

INSERT INTO YourTable VALUES
(1, '2test', 2),
(2, '3test', 3),
(3, '4test', 4),
(5, '1test', 1),
(6, '3test', 3),
(7, '2test', 2);

-- 递归CTE生成路径
WITH RecursivePaths AS (
    -- 锚点成员:初始化每个节点的路径为自身value
    SELECT 
        item,
        value,
        parentItem,
        CAST(value AS VARCHAR(MAX)) AS pathSegment
    FROM YourTable
    UNION ALL
    -- 递归成员:向上遍历父节点,将父节点的value拼在路径前面
    SELECT 
        r.item,
        r.value,
        t.parentItem,
        CAST(t.value + '/' + r.pathSegment AS VARCHAR(MAX)) AS pathSegment
    FROM RecursivePaths r
    JOIN YourTable t ON r.parentItem = t.item
)
-- 筛选每个节点的最顶层路径记录,拼接成目标格式
SELECT 
    item AS item1,
    '/' + pathSegment AS value1
FROM RecursivePaths
WHERE parentItem NOT IN (SELECT item FROM YourTable)
ORDER BY item1;

代码解释

  1. 锚点成员:选取所有表记录,为每个节点初始化路径片段为自身的value。
  2. 递归成员:通过r.parentItem = t.item关联当前节点的父节点,将父节点的value拼在当前路径片段的前面,实现从子节点向上遍历父节点、累积完整路径的效果。
  3. 最终查询:筛选出每个节点的最顶层路径记录(即parentItem不存在于表的item列中的记录,代表已经遍历到了最上层父节点),再在路径前添加/,得到你需要的格式。

运行结果

执行上述SQL后,会得到完全符合你需求的结果:

item1value1
1/4test/3test/2test
2/4test/3test
3/4test
5/4test/3test/2test/1test
6/4test/3test
7/4test/3test/2test

内容的提问来源于stack exchange,提问作者Anne Liu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:47:41