Создать представление с путем дерева по столбцу - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь сделать что-то подобное: Как я могу сгенерировать путь иерархии в 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 

1 Ответ

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

Ниже вы найдете решение вашей проблемы:

with CTE_tree
AS
(
select ht.id_hr, t.id_child, t.id_parent, 1 as rank_
from TREE t
INNER JOIN [THR_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, id_child, 'T'+ CAST(ROW_NUMBER() OVER(PARTITION BY id_hr order by rank_ DESC) AS VARCHAR(5)) as rank_
INTO #temp_tree
FROM CTE_tree

select id_hr, [T1], [T2], [T3], [T4], [T5], [T6], [T7], [T8], [T9], [T10]  
FROM (
SELECT id_hr, id_child , rank_ 
FROM #temp_tree )up  
PIVOT  
(
MIN(id_child) FOR rank_ IN ([T1],[T2],[T3],[T4],[T5],[T6],[T7],[T8],[T9],[T10])) AS pvt 
ORDER BY id_hr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...