给定许多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,但不能选择多个。请注意,自然可以有多个顶级父级(尽管分支仅向下进行,因此给定节点只有一个父级),并且也可以选择中级条目作为起点。
一,而不是UNION ALL
我天真地想JOIN
,但事实证明,这样的热膨胀系数是不允许的。
这是上面所有标记为红色的节点:(3, 6, 11, 13, 15)
。他们应该映射到(1, 1, 8, 8, 8)
。