如何从SQL Server中检索已排序的分层数据

时间:2018-05-19 23:07:45

标签: sql-server tsql hierarchical-data recursive-query

我见过很多层次结构的例子,但是我还没有能够正确排序。

要描述我的问题,请假设此任务表:

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的孩子,并根据标签订购。

请帮忙。谢谢!

1 个答案:

答案 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数据类型:

https://docs.microsoft.com/en-us/sql/t-sql/data-types/hierarchyid-data-type-method-reference?view=sql-server-2017