Wenn Sie sich die Olympischen Spiele ansehen - Ihren Beitrag nur überflogen haben - sieht es so aus, als ob Sie die Sortierung auf jeder Ebene (Stamm und eine Ebene darunter) steuern und sicherstellen möchten, dass die Daten mit den untergeordneten Elementen direkt unter den übergeordneten Elementen zurückgegeben werden (damit Sie die Daten...). Wir machen das die ganze Zeit. Sie können eine order by
hinzufügen zu jeder inneren Abfrage und erstellen Sie eine sort
Säule. Ich habe mir ein etwas anderes Beispiel ausgedacht, das Sie leicht auf Ihre Umstände anwenden können. Ich habe die Wurzel aufsteigend und die Ebene eins absteigend sortiert, nur um zu veranschaulichen, wie Sie jeden Teil steuern können.
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
Dies führt zu diesen Ergebnissen:
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
Sie können sehen, dass die Wurzelknoten aufsteigend und die inneren Knoten absteigend sortiert sind.