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

求助:无需指定起始ID的TSQL递归查询遍历路径实现

解决方案

要实现无需指定起始ID即可遍历所有完整路径,需调整递归CTE的锚点范围与终止逻辑,具体修改如下:

关键修改点

  • 锚点范围调整:从指定单个ID改为选取表中所有ID作为起始节点,确保每个节点都能成为路径起点。
  • 递归终止逻辑优化:移除原递归语句中WHERE t.NextID IS NOT NULL的限制,让递归在无后续节点时自动终止;最后筛选出路径终点(即NextID为空的记录),得到完整路径。
  • 空值修正:原数据中NextID存储的是字符串'Null',建议改为SQL原生NULL值,让空值判断更准确。

完整修改代码

CREATE TABLE Data (
    ID VARCHAR(10),
    NextID VARCHAR(10)
)

-- 修正NextID为原生NULL,而非字符串'Null'
INSERT Data VALUES 
('1','5'), ('2',NULL),
('3','6'), ('4','7'), ('5','8'), ('6','9'),
('7',NULL), ('8',NULL), ('9','10'),
('10',NULL);

;WITH RecursivePaths AS (
    -- 锚点:所有ID作为起始路径
    SELECT 
        ID, 
        NextID, 
        CAST(ID AS VARCHAR(MAX)) AS Path
    FROM Data

    UNION ALL
    
    SELECT 
        t.ID, 
        t.NextID, 
        r.Path + ' --> ' + CAST(t.ID AS VARCHAR(MAX))
    FROM Data t
    JOIN RecursivePaths r ON t.ID = r.NextID
    -- 无需额外条件,当r.NextID为NULL时,JOIN无匹配结果,递归自动终止
)
-- 筛选出所有完整路径(终点的NextID为NULL)
SELECT Path
FROM RecursivePaths
WHERE NextID IS NULL
ORDER BY Path;

执行结果

运行上述代码后,将得到你列出的所有完整路径:

1 --> 5 --> 8
2
3 --> 6 --> 9 --> 10
4 --> 7
8

兼容原数据格式的补充说明

如果必须保留原表中NextID为字符串'Null'的情况,只需调整两处:

  • 保持原INSERT语句的写法
  • 最后筛选条件改为WHERE NextID = 'Null'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:43:15