Один из способов сделать это - использовать рекурсивный cte, который также будет сохранять корневой узел каждой рекурсии, а затем запрашивать этот cte на основе корня нужного узла.
Сначала создайте и заполните образец таблицы: ( Пожалуйста, сохраните этот шаг в ваших будущих вопросах)
DECLARE @T AS TABLE
(
NodeId int,
Parent int
);
INSERT INTO @T (NodeId, Parent) VALUES
(1 , 0),
(3 , 1),
(7 , 3),
(8 , 3),
(4 , 1),
(9 , 4),
(10, 4),
(2 , 0),
(5 , 2),
(11, 5),
(12, 5),
(6 , 2),
(13, 6);
рекурсивный cte:
WITH CTE AS
(
SELECT NodeId, Parent, NodeId As Root
FROM @T
WHERE Parent = 0
UNION ALL
SELECT t.NodeId, t.Parent, Root
FROM @T As t
JOIN CTE
ON t.Parent = CTE.NodeId
)
Запрос:
SELECT NodeId, Parent
FROM CTE
WHERE Root = (SELECT Root FROM CTE WHERE NodeId = 4)
Результаты:
NodeId Parent
1 0
3 1
4 1
9 4
10 4
7 3
8 3
Вы можете увидеть живое демо на rextester.