Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Select-Anweisung, um übergeordnete und unendlich untergeordnete Elemente zurückzugeben

Verweisen Sie also auf diese Antwort:

SQL Server CTE Parent Child rekursiv

Hier ist eine funktionierende Version mit Ihrem Schema:

Tabellenerstellungsskript

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')
;

Rekursiver 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

Der Schlüsselteil befindet sich im CTE Erstellung, bei der UNION ALL verbindet sich wieder mit der Ergebnismenge und verbindet ID zu ParentId , wodurch die Anzahl der Ebenen nicht begrenzt wird.