[英]Finding the root node of a descendant in an Adjacency List
在邻接列表表中,给定节点的ID,如何找到它的关联根节点 ?
注意:
该表包含多棵树,因此我不能简单地搜索null parentId。
更多信息:
这是我目前所拥有的,对此有任何问题或改进吗?
with tree as
(
select
t.*
from table1 t
where t.id = @id
union all
select
t2.*
from tree
join table1 t2 on tree.parentId = t2.id
)
select *
from tree
where parentId is null
我认为所提供的任何解决方案都不比我自己的解决方案好,因此我最终选择了以下方法:
with tree as
(
select
t.*
from table1 t
where t.id = @id
union all
select
t2.*
from tree
join table1 t2 on tree.parentId = t2.id
)
select *
from tree
where parentId is null
这是带有WHILE循环的代码。 与表中的多个树配合使用:
declare @current_node int
declare @parent_node int
declare @MAX_ITERATIONS int
declare @count int
SET @current_node=@id -- node to start with
SET @MAX_ITERATIONS = 100 --maximum iterations count
SET @count=0
while(@count<@MAX_ITERATIONS) -- to prevent endless loop
begin
select @parent_node=parentid from tree where id=@current_node
if @parent_node is null -- root is found
begin
break;
end
set @current_node=@parent_node
SET @count=@count+1
end
if (@count=@MAX_ITERATIONS) SET @current_node=NULL --if it was endless loop
select @current_node; -- output root id
该解决方案对我来说效果很好。 但是不能肯定地说性能是否比您快。
declare @base_id as int;
set @base_id = 1;
WITH n(id) AS
(SELECT id
FROM table
WHERE id = @base_id
UNION ALL
SELECT nplus1.ID
FROM table as nplus1, n
WHERE n.id = nplus1.ParentID)
SELECT id FROM n
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.