Oglądanie igrzysk olimpijskich — po prostu przejrzałem swój post — wygląda na to, że chcesz kontrolować sortowanie na każdym poziomie (główny i jeden poziom do przodu) i upewnij się, że dane są zwracane z dziećmi bezpośrednio pod jego dane...). Robimy to cały czas. Możesz dodać order by
do każdego zapytania wewnętrznego i utwórz sort
kolumna. Stworzyłem nieco inny przykład, który powinien być dla ciebie łatwy do zastosowania w twojej sytuacji. Posortowałem pierwiastek rosnąco, a poziom pierwszy malejąco, aby zilustrować, jak możesz kontrolować każdą część.
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
Daje to następujące wyniki:
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
Możesz zobaczyć, że węzły główne są posortowane rosnąco, a węzły wewnętrzne są posortowane malejąco.