Xem Thế vận hội - chỉ cần lướt qua bài đăng của bạn - có vẻ như bạn muốn kiểm soát việc sắp xếp ở mỗi cấp (gốc và một cấp trong) và đảm bảo dữ liệu được trả về với các trẻ em trực tiếp bên dưới cấp độ gốc của nó (vì vậy bạn có thể trang dữ liệu...). Chúng tôi làm thế này hoài. Bạn có thể thêm một order by
cho mỗi truy vấn bên trong và tạo một sort
cột. Tôi lấy ra một ví dụ hơi khác mà bạn có thể dễ dàng áp dụng vào hoàn cảnh của mình. Tôi đã sắp xếp phần gốc tăng dần và mức một giảm dần chỉ để minh họa cách bạn có thể kiểm soát từng phần.
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
Điều này tạo ra những kết quả sau:
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
Bạn có thể thấy rằng các nút gốc được sắp xếp tăng dần và các nút bên trong được sắp xếp giảm dần.