如何从 SQL 服务器检索排序的分层数据
How to retrieve sorted hierarchical data form SQL Server
我看过很多分层 ctes 的例子,但我还不能正确排序。
为了描述我的问题,假设这个任务 table:
TaskId ParentTaskId Label
a10 null 10
a20 null 11
a30 a20 18
a50 a30 5
a40 a20 15
a60 null 12
我的查询输出应按标签和 children 的标签排序,如下所示:
Sequence TaskId Label
1 a10 10
2 a20 11
3 a40 15
4 a30 18
5 a50 5
6 a60 12
我添加了缩进,以便您更容易注意到分组。 a40和a30是a20的children,按标签排序
请帮忙。谢谢!
答案如下:
drop table if exists #t
go
select
*
into
#t
from
(
values
('a10', null, '10'),
('a20', null, '11'),
('a30', 'a20', '18'),
('a50', 'a30', '5'),
('a40', 'a20', '15'),
('a60', null, '12')
) as T(TaskId, ParentTaskId, Label)
;
with cte as
(
select
l = 0,
p = cast('/' + Label as nvarchar(max)),
*
from
#t where ParentTaskId is null
union all
select
l = p.l + 1,
p = p.p + '/' + c.Label,
c.*
from
#t c
inner join
cte p on c.ParentTaskId = p.TaskId
)
select
*
from
cte
order by p, Label
您需要创建一条从任务根目录到当前任务的路径,然后使用它对最终结果进行排序。
在小型数据集上,上述查询将执行良好。在更大的(数十万)我建议看看 hierarchyid
数据类型:
我看过很多分层 ctes 的例子,但我还不能正确排序。
为了描述我的问题,假设这个任务 table:
TaskId ParentTaskId Label
a10 null 10
a20 null 11
a30 a20 18
a50 a30 5
a40 a20 15
a60 null 12
我的查询输出应按标签和 children 的标签排序,如下所示:
Sequence TaskId Label
1 a10 10
2 a20 11
3 a40 15
4 a30 18
5 a50 5
6 a60 12
我添加了缩进,以便您更容易注意到分组。 a40和a30是a20的children,按标签排序
请帮忙。谢谢!
答案如下:
drop table if exists #t
go
select
*
into
#t
from
(
values
('a10', null, '10'),
('a20', null, '11'),
('a30', 'a20', '18'),
('a50', 'a30', '5'),
('a40', 'a20', '15'),
('a60', null, '12')
) as T(TaskId, ParentTaskId, Label)
;
with cte as
(
select
l = 0,
p = cast('/' + Label as nvarchar(max)),
*
from
#t where ParentTaskId is null
union all
select
l = p.l + 1,
p = p.p + '/' + c.Label,
c.*
from
#t c
inner join
cte p on c.ParentTaskId = p.TaskId
)
select
*
from
cte
order by p, Label
您需要创建一条从任务根目录到当前任务的路径,然后使用它对最终结果进行排序。
在小型数据集上,上述查询将执行良好。在更大的(数十万)我建议看看 hierarchyid
数据类型: