Получить уровень каждой строки в иерархической таблице SQL - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть такая таблица

ID    Name     Parent
-----------------------
1     Test1    NULL
2     Test2    NULL
3     Test3     1
4     Test4     3
5     Test5     2
6     Test6     4
7     Test7     3
-------------------------

Пожалуйста, помогите мне получить номер уровня вместе с каждой строкой.Вот так

ID    Name     Parent   Level
------------------------------
1     Test1    NULL      0
2     Test2    NULL      0
3     Test3     1        1
4     Test4     3        2
5     Test5     2        1
6     Test6     4        3
7     Test7     3        2
--------------------------------

Это похоже на построение каждого уровня этажей иерархии.

Я пропустил, чтобы указать, что я использую MS SQL 2012

1 Ответ

0 голосов
/ 19 февраля 2019

Мы можем справиться с этим с помощью рекурсивного CTE без особых проблем.В приведенном ниже CTE первая половина является базовым условием, которое включает в себя те записи верхнего родительского элемента, которые сами не имеют родителя.Рекурсивная часть, которая является нижней половиной объединения, предназначена для всех дочерних записей.Мы ведем учет уровня, добавляя единицу к значению непосредственного родителя.

WITH cte AS (
    SELECT ID, Name, Parent, 0 AS level
    FROM yourTable
    WHERE Parent IS NULL
    UNION ALL 
    SELECT t1.ID, t1.Name, t1.Parent, t2.level + 1
    FROM yourTable t1
    INNER JOIN cte t2
        ON t1.Parent = t2.ID
)

SELECT ID, Name, Parent, Level
FROM cte
ORDER BY ID;

enter image description here

Demo

...