Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Sélectionnez l'instruction pour retourner le parent et les enfants infinis

Donc, en faisant référence à cette réponse :

SQL Server CTE Parent Enfant récursif

Voici une version de travail avec votre schéma :

Script de création de table

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 récursif

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 partie clé est dans le CTE création où le UNION ALL rejoint le jeu de résultats, joignant ID à ParentId , ce qui ne limite pas le nombre de niveaux.