Текущий CTE, который вы используете, генерирует нисходящую иерархию данной id
, а не родительскую иерархию.
Одним из решений будет созданиевторой рекурсивный CTE для генерации родительской иерархии, а затем UNION
обе, как указано ниже:
WITH EmpCTE(ParentEmpId, Id, [Name], [Level]) AS
(
SELECT ParentEmpId, Id, [Name], 0 AS [Level]
FROM emp
WHERE id = 2
UNION ALL
SELECT E.ParentEmpId, E.Id, E.[Name], [Level] + 1
FROM emp E
INNER JOIN EmpCTE empCTE
ON E.ParentEmpId = EmpCTE.id
),
EmpCTE2(ParentEmpId, Id, [Name], [Level]) AS
(
SELECT ParentEmpId, Id, [Name], 0 AS [Level]
FROM emp
WHERE id = 2
UNION ALL
SELECT E.ParentEmpId, E.Id, E.[Name], [Level] + 1
FROM emp E
INNER JOIN EmpCTE2 empCTE2
ON E.id = EmpCTE2.ParentEmpId
)
SELECT * FROM EmpCTE
UNION
SELECT * FROM EmpCTE2
ORDER BY [name]
В этом обновлена база данных Fiddle , если дано id = 2
, запрос возвращает:
ParentEmpId Id Name Level
(null) 1 A 1
1 2 B 0
2 4 D 1
2 5 E 1