我有一个看起来像这样的表:
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个父母.
解决方法
你可以使用
recursive CTE.
declare @T table(ID int,Name char(1),Parent int); insert into @T values (1,'A',NULL),(2,'B',(3,'C',1),(4,'D',(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,stuff(ParentNames,1,3,'') as ParentNames from C;