我见过很多层次结构的例子,但是我还没有能够正确排序。
要描述我的问题,请假设此任务表:
RUN npm uninstall @angular/cli
我的查询输出应按Label和子标签进行排序,如下所示:
TaskId ParentTaskId Label
a10 null 10
a20 null 11
a30 a20 18
a50 a30 5
a40 a20 15
a60 null 12
我添加了缩进,以便您更容易注意到分组。 a40和a30是a20的孩子,并根据标签订购。
请帮忙。谢谢!
答案 0 :(得分:1)
以下是答案:
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
数据类型: