2012-02-02 32 views
6

Tôi có một bảng trông như thế này:Concatenation đệ quy của Phụ huynh Elements

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

Tôi muốn có một cái nhìn trở lại này:

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

Tôi cố gắng để rời tham gia một cái nhìn thấy một ID đầu tiên của cha mẹ và trái tham gia nó với chính nó nhưng điều đó không làm việc.

Có cách nào để thực hiện việc này mà không có thủ tục/chức năng được lưu trữ không? Tôi đã có ~ 15k hàng với ~ 0-5 cha mẹ mỗi nhưng tôi không muốn mã cứng tối đa là 5 cha mẹ.

+0

Tôi không có SSMS trên comp này. Kiểm tra liên kết này để lấy cảm hứng: http://www.codeproject.com/Articles/21082/Concatenate-Field-Values-in-One-String-Using-CTE-i – Malk

Trả lời

8

Bạn có thể sử dụng một 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;  
+0

Điều này có vẻ thú vị. Bạn sẽ làm như thế nào với các mục có thể nằm trong nhiều nút cha? Xem câu hỏi của tôi ở đây http://stackoverflow.com/questions/31685852/sql-statement-to-concatenate-categories-from-hierarchical-structure-into-a-singl Hy vọng bạn có thể giúp! – Flo

3

Không chắc chắn đây có phải là khả năng cho bạn hay không, nhưng bạn đã xem xét ID phân cấp mới chưa?

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

+0

whoa, không bao giờ biết về kiểu dữ liệu này, tôi đang đọc lên trên nó bây giờ ... – Greg

+0

Rất hay để biết. –

Các vấn đề liên quan