2010-04-26 42 views
6

Tôi có một bảng mà thực hiện một cây sử dụng HierarchyId cột dữ liệuPhân loại cây với cột khác trong SQL Server 2008

mẫu:

People    \ 
    Girls   \1\ 
     Zoey  \1\1\ 
     Kate  \1\2\ 
     Monica  \1\3\ 
    Boys   \2\ 
     Mark  \2\1\ 
     David  \2\2\ 

Đây là thứ tự sử dụng HierarchyId cột như loại cột

Tôi muốn sắp xếp dữ liệu bằng cách sử dụng cấu trúc phân cấp mà còn sử dụng tên do đó, nó sẽ trông như thế này:

People    \ 
    Boys   \2\ 
     David  \2\2\ 
     Mark  \2\1\   
    Girls   \1\ 
     Kate  \1\2\ 
     Monica  \1\3\ 
     Zoey  \1\1\  

Có một giải pháp đơn giản để làm điều này?

Có thể thực hiện với một truy vấn SQL duy nhất không?

Trả lời

7

Viết lại câu hỏi của bạn như một đệ quy CTE:

DECLARE @table TABLE (id INT NOT NULL PRIMARY KEY, name NVARCHAR(4000) NOT NULL, path HIERARCHYID) 

INSERT 
INTO @table 
VALUES 
     (1, 'People', '/'), 
     (2, 'Girls', '/1/'), 
     (3, 'Boys', '/2/'), 
     (4, 'Zoey', '/1/1/'), 
     (5, 'Kate', '/1/2/'), 
     (6, 'Monica', '/1/3/'), 
     (7, 'Mark', '/2/1/'), 
     (8, 'David', '/2/2/') 

;WITH q AS 
     (
     SELECT *, HIERARCHYID::Parse('/') AS newpath 
     FROM @table 
     WHERE path = HIERARCHYID::GetRoot() 
     UNION ALL 
     SELECT t.*, HIERARCHYID::Parse(q.newpath.ToString() + CAST(ROW_NUMBER() OVER (ORDER BY t.name) AS NVARCHAR(MAX)) + '/') 
     FROM q 
     JOIN @table t 
     ON  t.path.IsDescendantOf(q.path) = 1 
       AND t.path.GetLevel() = q.path.GetLevel() + 1 
     ) 
SELECT * 
FROM q 
ORDER BY 
     newpath 
+0

Cảm ơn rất nhiều! Hoạt động tuyệt vời – bodziec

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