Ver:
- SQL Server - Ejemplo simple de un CTE recursivo
- MSDN:Consultas recursivas mediante Expresión de tabla común
- CTE recursivo de SQL Server (¡Esto se parece mucho a lo que estás trabajando!)
Actualización:
Un CTE recursivo adecuado consta básicamente de tres cosas:
-
un ancla
SELECTpara empezar; que puede seleccionar, p. los empleados de nivel raíz (donde elReports_Toes NULL), o puede seleccionar cualquier empleado arbitrario que defina, p. por un parámetro -
a
UNION ALL -
un recursivo
SELECTdeclaració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