求助:无需指定起始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
相关产品推荐
相关产品推荐

