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

SQL Server中如何查询各节点遍历后的最终目标节点?

在SQL Server中查询节点最终指向的目标节点

要解决节点递归指向的问题,最适合的方法是使用递归CTE(Common Table Expression),通过递归追溯每个节点的指向关系,直到找到最终的目标节点(即无指向的节点,自身为终点)。

解决方案代码

WITH RecursiveNodeTrace AS (
    -- 锚点成员:初始化所有节点的初始指向
    SELECT 
        [Start],
        -- 若节点无指向(End为NULL),则最终目标为自身;否则为直接指向的节点
        COALESCE([End], [Start]) AS FinalTarget
    FROM dbo.NodeDirections

    UNION ALL

    -- 递归成员:持续追溯当前目标节点的指向,直到找到无指向的终点
    SELECT 
        rnt.[Start],
        COALESCE(nd.[End], nd.[Start]) AS FinalTarget
    FROM RecursiveNodeTrace rnt
    JOIN dbo.NodeDirections nd ON rnt.FinalTarget = nd.[Start]
    -- 终止条件:当当前目标节点还有指向时才继续递归
    WHERE nd.[End] IS NOT NULL
)

-- 筛选每个节点的最终目标(排除未到终点的中间记录)
SELECT DISTINCT
    [Start],
    FinalTarget AS [End]
FROM RecursiveNodeTrace
WHERE NOT EXISTS (
    SELECT 1 
    FROM dbo.NodeDirections nd 
    WHERE nd.[Start] = RecursiveNodeTrace.FinalTarget 
    AND nd.[End] IS NOT NULL
)
ORDER BY [Start];

代码说明

  1. 锚点成员:先获取所有节点的初始状态,直接处理无指向的节点(将自身设为目标),有指向的节点先记录其直接指向的节点。
  2. 递归成员:将当前的目标节点作为新的起始节点,继续查询它的指向,直到该节点无指向(End为NULL)为止。
  3. 最终筛选:通过NOT EXISTS排除还能继续递归的中间记录,只保留每个节点的最终目标节点。

补充说明

  • 若你的示例中节点A4需要出现在结果中,需确保它存在于NodeDirections表的Start列,比如补充插入语句:
    INSERT INTO dbo.NodeDirections ([Start], [End]) VALUES ('A4', 'A3');
    
  • 若存在循环指向(如A指向B,B指向A),需在查询末尾添加递归层数限制,避免无限循环:
    OPTION (MAXRECURSION 100); -- 可根据实际层级调整数值
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:45:10