Я пытаюсь сделать что-то подобное: Как я могу сгенерировать путь иерархии в SQL, который ведет к данному узлу?
Я на SQL Server 2016.
У меня есть две таблицы, первая , для зависимостей родитель-потомок:
CREATE TABLE [TREE] (
[ID_CHILD] varchar(8) NOT NULL,
[ID_PARENT] varchar(8) NULL,
[LEFT_VALUE] numeric(8, 0) NULL,
[RIGHT_VALUE] numeric(8, 0) NULL
)
Первый идентификатор узла - "ROOT".Значение Left и Right определяются следующим образом:
NODE (Left, Right)
ROOT (0,13)
- A1 (1,6)
-- B1 (2,3)
-- B2 (4,5)
- A2 (7,12)
-- B3 (8,11)
--- C1 (9,10)
ROOT | NULL | 0 | 13
A1 | ROOT | 1 | 6
B1 | A1 | 2 | 3
B2 | A1 | 4 | 5
A2 | ROOT | 7 | 12
B3 | A2 | 8 | 11
C1 | B3 | 9 | 10
Каждый левый-правый интервал включает все левые-правые дочерние числа.Мое дерево имеет максимальную глубину 10.
И второй , для воздействия на человеческие ресурсы в дереве:
CREATE TABLE [HR_TREE] (
[ID_HR] varchar(9) NOT NULL,
[ID_NODE] varchar(8) NULL
)
С некоторыми данными, подобными этим:
001664 | A1
001564 | B1
034564 | B1
001224 | C1
001677 | B3
Мне нужна ваша помощь для создания представления, которое показывает мне что-то вроде этого:
МОЯ ПОПЫТКА:
КАК СОЗДАТЬ ПРОСМОТР [FLAT_HR_TREE] ... ????
ID_HR | T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10
-----------------------------------------------------------------------------
001664 | ROOT | A1 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL
001564 | ROOT | A1 | B1 | NULL | NULL | NULL | NULL | NULL | NULL | NULL
034564 | ROOT | A1 | B1 | NULL | NULL | NULL | NULL | NULL | NULL | NULL
001224 | ROOT | A2 | B3 | C1 | NULL | NULL | NULL | NULL | NULL | NULL
001677 | ROOT | A2 | B3 | NULL | NULL | NULL | NULL | NULL | NULL | NULL
Спасибо за вашу помощь !!
Спасибо, ДЖЕРРИ, я сделал это:
CREATE VIEW MY_FLAT_TREE AS
with CTE_tree
AS
(
select ht.ID_HR, t.ID_CHILD, t.ID_PARENT, 1 as rank_
from TREE t
INNER JOIN HR_TREE ht ON t.ID_CHILD = ht.ID_NODE
UNION ALL
select ct.ID_HR, t.ID_CHILD, t.ID_PARENT, rank_ + 1 AS rank_
from TREE t
INNER JOIN CTE_tree ct ON ct.ID_PARENT = t.ID_CHILD
)
SELECT ID_HR, [T1], [T2], [T3], [T4], [T5], [T6], [T7], [T8], [T9], [T10]
FROM (
SELECT ID_HR, ID_CHILD, 'T'+ CAST(ROW_NUMBER() OVER(PARTITION BY ID_HR order by rank_ DESC) AS VARCHAR(5)) as rank_
FROM CTE_tree
)up
PIVOT
(
MIN(ID_CHILD) FOR rank_ IN ([T1],[T2],[T3],[T4],[T5],[T6],[T7],[T8],[T9],[T10])
) AS pvt