рекурсия — получение последовательности родительских папок в .Сеть с использованием рекурсии

#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