Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment concevoir une requête SQL récursive ?

Voir :

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ù le Reports_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