Как получить отсортированные иерархические данные формы SQL Server - PullRequest
0 голосов
/ 20 мая 2018

Я видел много примеров иерархических блоков, но я еще не смог правильно настроить сортировку.

Чтобы описать мою проблему, предположим следующую таблицу задач:

TaskId    ParentTaskId    Label
a10       null            10
a20       null            11
a30       a20             18
a50       a30             5
a40       a20             15
a60       null            12

Вывод моего запроса должен быть отсортирован по меткам и меткам детей, например:

Sequence   TaskId       Label
1          a10          10
2          a20          11
3            a40        15
4            a30        18
5              a50       5
6          a60          12

Я добавил отступ, чтобы вам было легче заметить группировку.a40 и a30 - дети a20 и заказываются на основании метки.

Пожалуйста, помогите.спасибо!

1 Ответ

0 голосов
/ 20 мая 2018

Вот ответ:

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

...