Разширявайки отговора на a_horse_with_no_name, това показва как да използвате внедряването на SQL Server на рекурсивна CTE (рекурсивно кръстосано прилагане на единичен запис ) в комбинация с row_number() за получаване на точния изход във въпроса.
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)
За да бъда честен, използването на самите идентификатори за създаване на „пътека“ на дървото би работило, тъй като поръчваме директно по идентификатор, но реших да вмъкна функцията row_number().