Menonton Olimpiade -- baca sekilas postingan Anda -- sepertinya Anda ingin mengontrol pengurutan di setiap level (root dan satu level ke dalam), dan pastikan data dikembalikan dengan anak-anak langsung di bawah induknya (sehingga Anda dapat membuka halaman data...). Kami melakukan ini sepanjang waktu. Anda dapat menambahkan order by
ke setiap kueri dalam dan buat sort
kolom. Saya membuat contoh yang sedikit berbeda yang seharusnya mudah untuk Anda terapkan pada keadaan Anda. Saya mengurutkan root naik dan turun level satu hanya untuk mengilustrasikan bagaimana Anda dapat mengontrol setiap bagian.
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
Ini menghasilkan hasil berikut:
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
Anda dapat melihat bahwa simpul akar diurutkan naik dan simpul dalam diurutkan turun.