Assistindo as Olimpíadas -- apenas folheei sua postagem -- parece que você quer controlar a classificação em cada nível (raiz e um nível), e certifique-se de que os dados sejam retornados com os filhos diretamente abaixo de seu pai (para que você possa paginar o dados...). Nós fazemos isso o tempo todo. Você pode adicionar um
order by
para cada consulta interna e crie um sort
coluna. Eu inventei um exemplo ligeiramente diferente que deve ser fácil para você aplicar à sua circunstância. Eu classifiquei a raiz ascendente e o nível um descendente apenas para ilustrar como você pode controlar cada 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
Isso produz estes resultados:
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
Você pode ver que os nós raiz são classificados em ordem crescente e os nós internos são classificados em ordem decrescente.