Here I repeat the levels, adding them to the table with the level at which it is located.
create table mytable (
node varchar(80),
parent varchar(80),
constraint PK_mytable primary key nonclustered (node)
)
create index IDX_mytable_parent on mytable (parent, node)
insert into mytable values ('a', null)
insert into mytable values ('b', 'a')
insert into mytable values ('c', 'a')
insert into mytable values ('d', 'a')
insert into mytable values ('e', 'b')
insert into mytable values ('f', 'b')
insert into mytable values ('g', 'd')
insert into mytable values ('h', 'f')
insert into mytable values ('i', 'g')
insert into mytable values ('j', 'g')
create function fn_level (@level int) returns @nodes table (Node varchar(80), TreeLevel int)
as begin
declare @current int
set @current = 0
while @current <= @level begin
if (@current = 0)
insert @nodes (Node, TreeLevel)
select node, @current
from mytable
where parent is null
else
insert @nodes (Node, TreeLevel)
select mt.node, @current
from @nodes n
inner join mytable mt on mt.parent = n.Node
where n.TreeLevel = (@current - 1)
set @current = @current + 1
end
return
end
select * from fn_level(2)
source
share