Рекурсивная конкатенация родительских элементов - PullRequest
6 голосов
/ 02 февраля 2012

У меня есть таблица, которая выглядит следующим образом:

ID     |Name    |Parent
1      |A       |NULL
2      |B       |NULL
3      |C       |1
4      |D       |1
5      |E       |3
6      |F       |5

Я хотел бы, чтобы представление возвращало это:

ID     |Name    |ParentNames
1      |A       |
2      |B       |
3      |C       |A
4      |D       |A
5      |E       |A > C
6      |F       |A > C > E

Я попытался покинуть представление, отображающее идентификаторыПервый родитель оставил соединение с самим собой, но это не сработало.

Есть ли способ сделать это без хранимой процедуры / функции?У меня есть ~ 15 тыс. Строк с ~ 0-5 родителями в каждой, но я бы предпочел не кодировать максимум 5 родителей.

Ответы [ 2 ]

8 голосов
/ 02 февраля 2012

Вы можете использовать рекурсивный CTE .

declare @T table(ID int, Name char(1), Parent int);

insert into @T values  
(1      ,'A'       ,NULL),
(2      ,'B'       ,NULL),
(3      ,'C'       ,1),
(4      ,'D'       ,1),
(5      ,'E'       ,3),
(6      ,'F'       ,5);

with C as
(
  select ID,
         Name,
         Parent,
         cast('' as varchar(max)) as ParentNames
  from @T
  where parent is null
  union all
  select T.ID,
         T.Name,
         T.Parent,
         C.ParentNames + ' > ' + C.Name
  from @T as T         
    inner join C
      on C.ID = T.Parent
)      
select ID,
       Name,
       stuff(ParentNames, 1, 3, '') as ParentNames
from C;     
3 голосов
/ 02 февраля 2012

Не уверен, что это возможно для вас, но вы изучили новый идентификатор иерархии?

http://msdn.microsoft.com/en-us/library/bb677290.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...