#c# #sql-server-2008 #recursion
#c# #sql-server-2008 #рекурсия
Вопрос:
У меня есть таблица со следующей структурой
ID Name Parent
----------- -------------------------------------------------- -----------
1 Root NULL
2 Root_A 1
3 Root_B 1
4 Root_C 1
5 Root_C_A 4
6 Root_C_A_A 5
7 Root_C_A_A_A 6
Итак, если я пройду 7
, я хотел бы получить следующее
Root --> Root_C --> Root_C_A --> Root_C_A_A
Это означает, что я хочу вернуться к root от дочернего элемента. Как я могу это сделать, используя хранимые процедуры SQL Server 2008 или с помощью других.Сетевые методы?
Я думаю, что могу выполнить задачу, используя recursive function
Ответ №1:
Вы можете реализовать рекурсию в Sql Server 2005 , используя общее табличное выражение. CTE позволяют вам присоединяться к самим себе для выполнения рекурсии. CTE продолжает выполнять рекурсию до тех пор, пока не будут возвращены строки, поэтому вы захотите убедиться, что вы надежно выполняете это конечное условие.
declare @folders as table (id int, name nvarchar(20), parent int);
insert into @folders values(1, 'Root', null);
insert into @folders values(2, 'Root_A', 1);
insert into @folders values(3, 'Root_B', 1);
insert into @folders values(4, 'Root_C', 1);
insert into @folders values(5, 'Root_C_A', 4);
insert into @folders values(6, 'Root_C_A_A', 5);
insert into @folders values(7, 'Root_C_A_A_A', 6);
declare @folderID int;
set @folderID=7;
with Folders (id, name, parent, number) as
(
select ID, name, parent, 0 as number
from @folders
where id=@folderID
union all
select i.ID, i.Name, i.Parent, d.number 1
from @folders as i
inner join Folders as d on d.Parent = i.ID
)
select id, name, number
from Folders
order by number desc;
Ответ №2:
попробуйте это:
declare @result varchar(100)
declare @id int
set @id = 7
select @result=Name,@id=Parent from temp where id=@id
while(exists(select 1 from temp where id=@id))
begin
select @id=Parent,@result=case @result when '' then Name else Name '-->' end @result from temp where id=@id
end
select @result