如何从 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 数据类型:

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