在层次表中获取孩子的根父级

Imm*_*tal 4 sql sql-server sql-server-2008 sql-server-2008-r2

我有一个带有分层数据的表,其结构如下:

ID      ParentId
----   ----------
1       NULL
2       1
3       2
4       2
5       3
6       5
Run Code Online (Sandbox Code Playgroud)

如果我传递节点ID,则希望通过遍历SQL中的所有父节点来获得最高的节点ID /细节。

我尝试过CTE,但无法以某种方式正确组合。但是,我将此功能用作函数,但是它太慢了,以至于我不得不发布这个问题。

在上面的示例中,如果我通过6,则我想拥有最高的即1。通过遍历6 => 5 => 3 => 2 => [1](结果)

在此先感谢您的帮助。

Dou*_*nen 6

DECLARE @id INT = 6
;WITH parent AS
(
    SELECT id, parentId, 1 AS [level] from tbl WHERE id = @id
    UNION ALL 
    SELECT t.id, t.parentId, [level] + 1 FROM parent
    INNER JOIN tbl t ON t.id =  parent.parentid
)
SELECT TOP 1 id FROM parent ORDER BY [level] DESC
Run Code Online (Sandbox Code Playgroud)

@TechDo的答案假定最低ID为父级。如果您不想依赖于此,则上面的查询将按深度排序。


Tec*_*hDo 5

请试试:

declare @id int=6
;WITH parent AS
(
    SELECT id, parentId  from tbl WHERE id = @id
    UNION ALL 
    SELECT t.id, t.parentId FROM parent
    INNER JOIN tbl t ON t.id =  parent.parentid
)

SELECT TOP 1 id FROM  parent
order by id asc
Run Code Online (Sandbox Code Playgroud)