观看奥运会 - 刚刚浏览了您的帖子 - 看起来您想要控制每个级别(根和一级)的排序,并确保返回数据时子级直接位于其父级下方(这样您就可以分页数据...)。我们一直这样做。您可以添加一个order by
每个内部查询并创建一个sort
柱子。我设计了一个稍微不同的示例,您应该可以轻松地将其应用于您的情况。我对根升序和一级降序进行排序只是为了说明如何控制每个部分。
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
您可以看到根节点按升序排序,内部节点按降序排序。