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

Come progettare una query ricorsiva SQL?

Vedi:

Aggiornamento:

Un corretto CTE ricorsivo consiste fondamentalmente di tre cose:

  • un ancora SELECT iniziare con; che può selezionare ad es. i dipendenti di livello principale (dove Reports_To è NULL), oppure può selezionare qualsiasi dipendente arbitrario da te definito, ad es. da un parametro

  • a UNION ALL

  • un ricorsivo SELECT istruzione che seleziona dalla stessa tabella, tipicamente autoreferenziale, e si unisce al CTE ricorsivo attualmente in costruzione

Questo ti dà la possibilità di creare ricorsivamente un set di risultati da cui puoi poi selezionare.

Se guardi il Northwind database di esempio, ha una tabella chiamata Employees che è autoreferenziale:Employees.ReportsTo --> Employees.EmployeeID definisce chi segnala a chi.

Il tuo CTE sarebbe simile a questo:

;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    

Non so se puoi tradurre il tuo campione in un CTE ricorsivo adeguato, ma il succo è sostanzialmente questo:interrogazione di ancoraggio, UNION ALL, query ricorsiva