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
SELECT
para empezar; que puede seleccionar, p. los empleados de nivel raíz (donde elReports_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