как получить иерархию в SQL сервере, TSQL, SQL - PullRequest
0 голосов
/ 11 мая 2018

Таблица

ref_id parent_id
A        B
B        C
C        D
D        D
X        Y
Y        Y
P        Q
Q        R
R        R

Выходная иерархия

A
B
C
D
X
Y
P
Q
R

Если ref_id = parent_id, то его вершина дерева, т.е. родительский элемент всех.

1 Ответ

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

Вы можете использовать следующий запрос:

WITH HIER_CTE AS (
    -- Anchor member: get root nodes 
    SELECT ref_id, parent_id, 1 AS lvl,
           -- Use ROW_NUMBER() to assign a unique ID to each root node 
           ROW_NUMBER() OVER (ORDER BY ref_id) AS rn
    FROM mytable
    WHERE ref_id = parent_id

    UNION ALL

    -- Recursive member: get node of next level
    SELECT t.ref_id, t.parent_id, h.lvl + 1 AS lvl, rn
    FROM mytable AS t
    INNER JOIN HIER_CTE AS h ON h.ref_id = t.parent_id
    WHERE t.ref_id <> t.parent_id
)
SELECT ref_id
FROM HIER_CTE
ORDER BY rn, lvl DESC

Выход:

ref_id
------
A
B
C
D
P
Q
R
X
Y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...