オリンピックを見て - あなたの投稿をざっと読んだだけです - 各レベル (ルートと 1 レベル) で並べ替えを制御し、親のすぐ下にある子でデータが返されるようにします (したがって、データ...)。私たちはこれを常に行っています。 order by
を追加できます 各内部クエリに sort
を作成します 桁。あなたの状況に簡単に適用できるように、少し異なる例を考案しました。各部分をどのように制御できるかを説明するために、ルートを昇順に並べ替え、レベル 1 を降順に並べました。
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
これにより、次の結果が生成されます:
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
ルート ノードが昇順に並べ替えられ、内部ノードが降順に並べ替えられていることがわかります。