Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Selezionare l'istruzione per restituire genitore e figli infiniti

Quindi facendo riferimento a questa risposta:

SQL Server CTE Parent Child ricorsivo

Ecco una versione funzionante con il tuo schema:

Script di creazione della tabella

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

CTE ricorsivo

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

La parte fondamentale è nel CTE creazione dove il UNION ALL si unisce nuovamente al set di risultati, unendo ID a ParentId , che non limita il numero di livelli.