Voir :
- SQL Server - Exemple simple d'un CTE récursif
- MSDN :requêtes récursives utilisant l'expression de table commune
- CTE récursif SQL Server (cela ressemble à peu près exactement à ce sur quoi vous travaillez !)
Mise à jour :
Un CTE récursif approprié consiste essentiellement en trois choses :
-
une ancre
SELECT
pour commencer; qui peut sélectionner par ex. les employés de niveau racine (où leReports_To
est NULL), ou il peut sélectionner n'importe quel employé arbitraire que vous définissez, par ex. par un paramètre -
a
UNION ALL
-
un récursif
SELECT
instruction qui sélectionne à partir de la même table, généralement auto-référençante, et se joint au CTE récursif en cours de construction
Cela vous donne la possibilité de créer de manière récursive un ensemble de résultats dans lequel vous pouvez ensuite sélectionner.
Si vous regardez le Northwind
exemple de base de données, elle contient une table appelée Employees
qui se référence automatiquement :Employees.ReportsTo --> Employees.EmployeeID
définit qui relève de qui.
Votre CTE ressemblerait à ceci :
;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
Je ne sais pas si vous pouvez traduire votre exemple en un CTE récursif approprié - mais c'est essentiellement l'essentiel :requête d'ancrage, UNION ALL, requête récursive