父元素的递归连接

时间:2012-02-02 05:41:31

标签: sql sql-server sql-server-2008

我有一个看起来像这样的表:

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

我试图离开加入一个显示ID第一个父级的视图,然后将其自身加入,但这不起作用。

有没有办法在没有存储过程/函数的情况下执行此操作?我有~15k行,每个~0-5个父母,但我宁愿不用硬代码最多5个父母。

2 个答案:

答案 0 :(得分:8)

您可以使用recursive 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;     

答案 1 :(得分:3)

不确定您是否有这种可能性,但是您是否查看了新的层次结构ID?

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