Guardando le Olimpiadi - appena sfogliato il tuo post - sembra che tu voglia controllare l'ordinamento a ogni livello (root e un livello in) e assicurarti che i dati vengano restituiti con i bambini direttamente sotto il suo genitore (in modo da poter paginare il dati...). Lo facciamo sempre. Puoi aggiungere un order by
a ciascuna query interna e creare un sort
colonna. Ho inventato un esempio leggermente diverso che dovrebbe essere facile da applicare alla tua circostanza. Ho ordinato la radice ascendente e il livello uno discendente solo per illustrare come puoi controllare ogni parte.
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
Questo produce questi risultati:
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
Puoi vedere che i nodi radice sono ordinati in ordine crescente e i nodi interni sono ordinati in ordine decrescente.