Tema SQL
CTE recursiva (WITH RECURSIVE)
Recorrer jerarquías o generar series con una CTE que se referencia a sí misma.
Descripción
El caso base hace UNION ALL con la parte recursiva hasta que la condición corta. Sintaxis WITH RECURSIVE en PostgreSQL, SQL Server, SQLite… (manual §17.1).
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
WITH RECURSIVE nombre AS (
SELECT ... -- caso base
UNION ALL
SELECT ... FROM nombre WHERE ...
)
SELECT * FROM nombre;
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Recursión
- Cuidado con ciclos infinitos; algunos motores permiten opciones de profundidad máxima.
Ejemplos
Ejemplo 1
WITH RECURSIVE numeros AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM numeros WHERE n < 10
)
SELECT * FROM numeros;
Ejemplo 2
WITH RECURSIVE r AS (SELECT 1 AS n UNION ALL SELECT n+1 FROM r WHERE n<3) SELECT * FROM r;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.