sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo diseñar una consulta recursiva de SQL?

Ver:

Actualización:

Un CTE recursivo adecuado consta básicamente de tres cosas:

  • un ancla SELECT para empezar; que puede seleccionar, p. los empleados de nivel raíz (donde el Reports_To es NULL), o puede seleccionar cualquier empleado arbitrario que defina, p. por un parámetro

  • a UNION ALL

  • un recursivo SELECT declaración que selecciona de la misma tabla, típicamente autorreferencial, y se une con el CTE recursivo que se está construyendo actualmente

Esto le brinda la capacidad de generar recursivamente un conjunto de resultados que luego puede seleccionar.

Si miras el Northwind base de datos de muestra, tiene una tabla llamada Employees que es autorreferencial:Employees.ReportsTo --> Employees.EmployeeID define quién informa a quién.

Su CTE se vería así:

;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    

No sé si puede traducir su muestra a un CTE recursivo adecuado, pero esa es básicamente la esencia:consulta de anclaje, UNION ALL, consulta recursiva