Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Selecione a instrução para retornar pai e filhos infinitos


Então, referenciando esta resposta:

SQL Server CTE pai filho recursivo

Aqui está uma versão de trabalho com seu esquema:

Script de criação de tabela
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 recursivo
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

A parte chave está no CTE criação onde o UNION ALL junta-se novamente ao conjunto de resultados, juntando ID para ParentId , que não limita o número de níveis.