Odnosząc się do tej odpowiedzi:
Rekursywne CTE SQL Server CTE nadrzędny/podrzędny
Oto działająca wersja ze schematem:
Skrypt tworzenia tabeli
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')
;
Rekurencyjne 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
Kluczowa część znajduje się w CTE
tworzenie, w którym UNION ALL
dołącza z powrotem do zestawu wyników, dołączając do ID
do ParentId
, co nie ogranicza liczby poziomów.