Takže s odkazem na tuto odpověď:
Rekurzivní SQL Server CTE Parent Child
Zde je pracovní verze s vaším schématem:
Skript pro vytvoření tabulky
CREATE TABLE YOUR_TABLE
([ID] int, [ParentID] int, [Name] varchar(21))
;
INSERT INTO YOUR_TABLE
([ID], [ParentID], [Name])
VALUES
(1, NULL, 'A root'),
(2, NULL, 'Another root'),
(3, 1, 'Child of 1'),
(4, 3, 'Grandchild of 1'),
(5, 4, 'Great grandchild of 1'),
(6, 1, 'Child of 1'),
(7, NULL, 'Another root'),
(8, 7, 'Child of 6')
;
Rekurzivní CTE
DECLARE @ID INT = 1
;WITH ParentChildCTE
AS (
SELECT ID, ParentId, Name
FROM YOUR_TABLE
WHERE Id = @ID
UNION ALL
SELECT T1.ID, T1.ParentId, T1.Name
FROM YOUR_TABLE T1
INNER JOIN ParentChildCTE T ON T.ID = T1.ParentID
WHERE T1.ParentID IS NOT NULL
)
SELECT *
FROM ParentChildCTE
Klíčová část je v CTE
vytvoření, kde je UNION ALL
se připojí zpět k sadě výsledků a připojí ID
na ParentId
, což neomezuje počet úrovní.