Mở rộng trên câu trả lời của a_horse_with_no_name, phần này cho thấy cách sử dụng SQL Server triển khai CTE đệ quy ( áp dụng chéo một bản ghi đệ quy ) kết hợp với row_number () để tạo ra kết quả chính xác trong câu hỏi.
declare @t table(id int,parentId int,name varchar(20))
insert @t select 1, 0 ,'Category1'
insert @t select 2, 0, 'Category2'
insert @t select 3, 1, 'Category3'
insert @t select 4 , 2, 'Category4'
insert @t select 5 , 1, 'Category5'
insert @t select 6 , 2, 'Category6'
insert @t select 7 , 3, 'Category7'
;
WITH tree (id, parentid, level, name, rn) as
(
SELECT id, parentid, 0 as level, name,
convert(varchar(max),right(row_number() over (order by id),10)) rn
FROM @t
WHERE parentid = 0
UNION ALL
SELECT c2.id, c2.parentid, tree.level + 1, c2.name,
rn + '/' + convert(varchar(max),right(row_number() over (order by tree.id),10))
FROM @t c2
INNER JOIN tree ON tree.id = c2.parentid
)
SELECT *
FROM tree
ORDER BY cast('/' + RN + '/' as hierarchyid)
Thành thật mà nói, việc sử dụng chính các ID để tạo ra "đường dẫn" cây sẽ hoạt động, vì chúng tôi sắp xếp thứ tự trực tiếp bằng id, nhưng tôi nghĩ rằng tôi sẽ trượt trong hàm row_number ().