Я пытаюсь перечислить все иерархии в выборке данных, каждый набор иерархий имеет один идентификатор.
DROP TABLE IF EXISTS EmpGroup;
CREATE TABLE EmpGroup
(
Empid INT,
Dept VARCHAR(10),
MgrId INT
)
GO
INSERT INTO EmpGroup
VALUES (1, 'Main', NULL), (2, 'IT', 1), (3, 'Dotcom', 2), (4, 'Finance', NULL),
(5, 'HR', 4), (6, 'Accounting', 4), (7, 'main2', NULL), (8, 'IT1', 7)
GO
--select * from EmpGroup
;WITH cte AS
(
SELECT
1 AS Lvl,
EmpId LeafId,
EmpID,
MgrId,
Dept,
Dept LeafDept
FROM
EmpGroup
UNION ALL
SELECT
Lvl+1 AS Lvl,
OI.LeafId,
OG.EmpId as rootGroupId,
Og.MgrId,
OG.Dept,
OI.LeafDept
FROM
EmpGroup OG
JOIN
cte OI ON OI.MgrId = OG.EmpId
)
, cte_rn AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY LeafID ORDER BY Lvl DESC) rn
FROM
cte
)
SELECT *
FROM cte_rn
WHERE rn = 1
Вывод:
Шаг, который я хочу решить, заключается в добавлении идентификатора для каждой комбинации иерархии.
Итак, для строки 5 строка 4 является родительской.Аналогично, для строки 6 она также должна возвращать кажущуюся запись как 4.
Кроме того, для каждой комбинации иерархии должен быть назначен идентификатор.
Предполагаемый результат:
Я ищу оптимизированный способ достижения этого.Заранее спасибо за помощь!