Als je naar de Olympische Spelen kijkt -- heb je bericht even geskimd -- lijkt het alsof je de sortering op elk niveau (root en één niveau in) wilt regelen en ervoor wilt zorgen dat de gegevens worden geretourneerd met de kinderen direct onder de bovenliggende (zodat je de pagina gegevens...). We doen dit de hele tijd. U kunt een order by
op elke innerlijke query en maak een sort
kolom. Ik heb een iets ander voorbeeld bedacht dat gemakkelijk voor u zou moeten zijn om op uw situatie toe te passen. Ik heb de wortel oplopend gesorteerd en niveau één aflopend om te illustreren hoe je elk onderdeel kunt besturen.
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
Dit levert de volgende resultaten op:
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
U kunt zien dat de hoofdknooppunten oplopend zijn gesorteerd en de binnenste knooppunten aflopend.