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
SELECT
iniziare 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
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