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

Rufen Sie Datensätze ab, die alle untergeordneten Datensätze in SQL Server enthalten

Sie müssen einen rekursiven allgemeinen Tabellenausdruck verwenden und dann die Ergebnisse nur nach dem Basispfad für jeden Datensatz filtern (d. h. für ID 1131 erhalten Sie ABC/RST/UVW und nicht nur ABC/RST

WITH CTE AS
(   SELECT  ID, 
            Name, 
            ParentID, 
            NextParentID = ParentID, 
            Path = CAST(Name AS VARCHAR(MAX)),
            Recursion = 1
    FROM    T
    UNION ALL
    SELECT  CTE.ID, 
            CTE.Name, 
            CTE.ParentID, 
            T.ParentID, 
            CAST(T.Name + '/' + CTE.Path AS VARCHAR(MAX)),
            Recursion + 1
    FROM    CTE
            INNER JOIN T
                ON CTE.NextParentID = T.ID
), CTE2 AS
(   SELECT  CTE.ID,
            CTE.Name,
            CTE.ParentID,
            CTE.Path,
            RowNumber = ROW_NUMBER() OVER(PARTITION BY CTE.ID ORDER BY Recursion DESC)
    FROM    CTE
)
SELECT  ID, Name, ParentID, Path
FROM    CTE2
WHERE   RowNumber = 1;

Beispiel für SQL Fiddle