Как объединить родительские и дочерние строки в иерархической таблице на сервере SQL? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть таблица адресов, и я хочу объединить строки, такие как parent-1 => parent-1 / all-child, parent-2 => parent-2 / all-child и так далее ...

Адресная таблица

ID   Caption   Parent
---------------------
1    A          NULL
2    B          NULL
3    a          1
4    b          2
5    bb         4
6    C          NULL
7    aa         3
8    c          6

NULL Родитель имеет среднее значение Root

Желаемый вывод

ID   Caption   Parent
---------------------
1    A          NULL
3    A/a        1
7    A/a/aa     3
2    B          NULL
4    B/b        2
5    B/b/bb     4
6    C          NULL
8    C/c        6

1 Ответ

0 голосов
/ 02 апреля 2020

Вы можете использовать рекурсивный cte для этого. Идея состоит в том, чтобы начать с узлов root и пройти по иерархии к листам, конкатенируя путь, как вы go.

with cte as (
    select id, cast(caption as nvarchar(max)) caption, parent from mytable where parent is null
    union all 
    select t.id, cast(c.caption + '/' + t.caption as nvarchar(max)), t.parent
    from cte c
    inner join mytable t on t.parent = c.id
)
select * from cte order by caption

Демонстрация на DB Fiddle :

id | caption | parent
:- | :------ | -----:
1  | A       |   <em>null</em>
3  | A/a     |      1
7  | A/a/aa  |      3
2  | B       |   <em>null</em>
4  | B/b     |      2
5  | B/b/bb  |      4
6  | C       |   <em>null</em>
8  | C/c     |      6
...