给定一些ID,每个ID可能连接到同一张表中的其他条目,我想找到它们的顶级父项。也就是那些父ID为
NULL
的行。因此,每个红色单元下方都将与相应的绿色单元链接起来,如下所示:
借鉴了这个非常相似问题中的答案,以下是模拟架构。DECLARE @t TABLE (ID INT, link INT)
INSERT INTO @t VALUES
(1, NULL),
(2, 1),
(3, 2),
(4, 3),
(5, 3),
(6, 2),
(7, 1),
(8, NULL),
(9, 8),
(10, 9),
(11, 9),
(12, 9),
(13, 12),
(14, 12),
(15, 8);
我有一组ID,例如6和13,它们是两个底层节点。然后我希望得到一个结果集,如(6, 1) 和 (13, 8)。为了构建每个链接,答案建议使用常见表达式。
WITH cte AS (
SELECT ID, link
FROM @t
WHERE ID IN (6, 13)
UNION ALL
SELECT t.ID, t.link
FROM @t t
JOIN cte c ON t.ID = c.link
WHERE t.link IS NOT NULL
)
SELECT *
FROM cte
这将产生以下结果:
ID | link
----+------
6 | 2
13 | 12
12 | 9
9 | 8
2 | 1
然而,我不确定如何将此组合为每个起始点的一个结果。对于一个ID,我可以选择结果集的最后一行并获取链接ID,但无法处理多个ID。请注意,自然可以有多个顶级父级(尽管分支只向下延伸,因此对于给定节点只有一个父级),也可以选择中间级别的条目作为起始点。
与其使用UNION ALL
,我天真地尝试了JOIN
,但结果发现不允许使用这样的CTE。
这是上面所有红色节点:(3, 6, 11, 13, 15)
。它们应该映射到(1, 1, 8, 8, 8)
。