Vedi:
- SQL Server - Semplice esempio di CTE ricorsivo
- MSDN:query ricorsive che utilizzano l'espressione di tabella comune
- CTE ricorsivo di SQL Server (sembra più o meno esattamente quello su cui stai lavorando!)
Aggiornamento:
Un corretto CTE ricorsivo consiste fondamentalmente di tre cose:
-
un ancora
SELECTiniziare con; che può selezionare ad es. i dipendenti di livello principale (doveReports_Toè NULL), oppure può selezionare qualsiasi dipendente arbitrario da te definito, ad es. da un parametro -
a
UNION ALL -
un ricorsivo
SELECTistruzione 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