我需要得到一个给定某个节点的相关节点树,但不是必需的顶层节点。我已经有了一个使用两个CTE的解决方案,因为我正在努力把它全部整合到一个CTE中:)。可能有人有一个圆滑的解决方案来避免使用两个CTE?下面是一些代码,我跟打:sql递归:找到树给定中间节点
DECLARE @temp AS TABLE (ID INT, ParentID INT)
INSERT INTO @temp
SELECT 1 ID, NULL AS ParentID
UNION ALL
SELECT 2, 1
UNION ALL
SELECT 3, 2
UNION ALL
SELECT 4, 3
UNION ALL
SELECT 5, 4
UNION ALL
SELECT 6, NULL
UNION ALL
SELECT 7, 6
UNION ALL
SELECT 8, 7
DECLARE @startNode INT = 4
;WITH TheTree (ID,ParentID)
AS (
SELECT ID, ParentID
FROM @temp
WHERE ID = @startNode
UNION ALL
SELECT t.id, t.ParentID
FROM @temp t
JOIN TheTree tr ON t.ParentID = tr.ID
)
SELECT * FROM TheTree
;WITH Up(ID,ParentID)
AS (
SELECT t.id, t.ParentID
FROM @temp t
WHERE t.ID = @startNode
UNION ALL
SELECT t.id, t.ParentID
FROM @temp t
JOIN Up c ON t.id = c.ParentID
)
--SELECT * FROM Up
,TheTree (ID,ParentID)
AS (
SELECT ID, ParentID
FROM Up
WHERE ParentID is null
UNION ALL
SELECT t.id, t.ParentID
FROM @temp t
JOIN TheTree tr ON t.ParentID = tr.ID
)
SELECT * FROM TheTree
感谢
非常感谢。正如你所说的'几乎不符合'光滑'':),从性能角度来看,我认为最好跟2个CTE一起去。我记得教授谈到用两个锚(递回的方式)递归时,只是希望有人知道它,它适用于我的情况。 – user2065377
可能会有某种方法在递归连接中嵌入'OR'子句,以同时上下移动,但我无法弄清楚如何排除先前选择的行。 –
听到听到:)同样在这里... – user2065377