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

Como projetar uma consulta recursiva SQL?


Ver:

Atualização:

Um CTE recursivo adequado consiste basicamente em três coisas:

  • uma âncora SELECT começar com; que pode selecionar, por exemplo, os funcionários de nível raiz (onde o Reports_To é NULL), ou pode selecionar qualquer funcionário arbitrário que você definir, por exemplo, por um parâmetro

  • a UNION ALL

  • um recursivo SELECT instrução que seleciona da mesma tabela, normalmente auto-referenciada, e une-se ao CTE recursivo que está sendo construído no momento

Isso lhe dá a capacidade de construir recursivamente um conjunto de resultados que você pode selecionar.

Se você olhar para o Northwind banco de dados de exemplo, ele tem uma tabela chamada Employees que é auto-referenciado:Employees.ReportsTo --> Employees.EmployeeID define quem se reporta a quem.

Seu CTE ficaria assim:
;WITH RecursiveCTE AS
(
    -- anchor query; get the CEO
    SELECT EmployeeID, FirstName, LastName, Title, 1 AS 'Level', ReportsTo
    FROM dbo.Employees
    WHERE ReportsTo IS NULL

    UNION ALL

    -- recursive part; select next Employees that have ReportsTo -> cte.EmployeeID      
    SELECT 
       e.EmployeeID, e.FirstName, e.LastName, e.Title, 
       cte.Level + 1 AS 'Level', e.ReportsTo
    FROM 
       dbo.Employees e
    INNER JOIN 
       RecursiveCTE cte ON e.ReportsTo = cte.EmployeeID
)
SELECT *
FROM RecursiveCTE
ORDER BY Level, LastName    

Não sei se você pode traduzir sua amostra para um CTE recursivo adequado - mas essa é basicamente a essência:consulta âncora, UNION ALL, consulta recursiva