SQL Server递归遍历Type=2记录实现自动替换合并查询结果
SQL Server 递归查询实现方案
你需要的逻辑可以通过SQL Server自带的递归公用表表达式(CTE)直接实现,无需手动写循环执行语句,完整代码如下:
WITH RecursiveCTE AS ( -- 锚点:执行初始查询,记录根节点ID用于后续替换 SELECT [ID], [ID] AS RootID, ID1, ID2, [Type] FROM [dbo].[Test_DB] WHERE ID1 = 29 UNION ALL -- 递归节点:取上层Type=2的记录的ID2作为新查询的ID1参数 SELECT t.[ID], r.RootID, t.ID1, t.ID2, t.[Type] FROM [dbo].[Test_DB] t INNER JOIN RecursiveCTE r ON t.ID1 = r.ID2 WHERE r.[Type] = 2 ) -- 最终输出:替换ID1为根ID,过滤所有Type=2的记录 SELECT [ID], RootID AS ID1, ID2, [Type] FROM RecursiveCTE WHERE [Type] != 2 -- 递归层级超过100时打开下方注释,0代表不限制递归层级 -- OPTION (MAXRECURSION 0)
逻辑说明
- 锚点部分执行你初始的查询逻辑,额外新增
RootID字段存储每条记录对应的初始关联ID,保证后续子查询继承同一个根ID - 递归部分自动迭代查询所有Type=2的记录对应的ID2关联数据,直到没有符合条件的新数据为止
- 最终查询直接将ID1替换为提前存储的RootID,同时过滤所有Type=2的记录,直接得到最终合并结果
注意事项
- 该方案兼容SQL Server 2008及以上所有版本
- 当递归层级超过默认的100层时,开启代码末尾的
OPTION (MAXRECURSION 0)配置即可
内容的提问来源于stack exchange,提问作者AZE
相关产品推荐
相关产品推荐

