Når du ser OL -- har lige skimmet dit indlæg -- ser det ud som om du vil kontrollere sorteringen på hvert niveau (rod og et niveau i), og sørge for at dataene returneres med børnene direkte under dets forælder (så du kan bladre data...). Det gør vi hele tiden. Du kan tilføje en order by
til hver indre forespørgsel og opret en sort
kolonne. Jeg udtænkte et lidt anderledes eksempel, som burde være nemt for dig at anvende på din omstændighed. Jeg sorterede roden stigende og niveau et faldende blot for at illustrere, hvordan du kan kontrollere hver del.
declare @tbl table (id int, parent int, name varchar(10))
insert into @tbl (id, parent, name)
values (1, null, 'def'), (2, 1, 'this'), (3, 1, 'is'), (4, 1, 'a'), (5, 1, 'test'),
(6, null, 'abc'), (7, 6, 'this'), (8, 6, 'is'), (9, 6, 'another'), (10, 6, 'test')
;with cte (id, parent, name, sort) as (
select id, parent, name, cast(right('0000' + cast(row_number() over (order by name) as varchar(4)), 4) as varchar(1024))
from @tbl
where parent is null
union all
select t.id, t.parent, t.name, cast(cte.sort + right('0000' + cast(row_number() over (order by t.name desc) as varchar(4)), 4) as varchar(1024))
from @tbl t inner join cte on t.parent = cte.id
)
select * from cte
order by sort
Dette giver disse resultater:
id parent name sort
---- -------- ------- ----------
6 NULL abc 0001
7 6 this 00010001
10 6 test 00010002
8 6 is 00010003
9 6 another 00010004
1 NULL def 0002
2 1 this 00020001
5 1 test 00020002
3 1 is 00020003
4 1 a 00020004
Du kan se, at rodknuderne er sorteret stigende, og de indre knudepunkter er sorteret faldende.