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](结果)
在此先感谢您的帮助。
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为父级。如果您不想依赖于此,则上面的查询将按深度排序。
请试试:
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)