Tema SQL
CTE (WITH)
Define uno o más resultados intermedios con nombre en el ámbito de una sola sentencia. Mejora la legibilidad frente a subconsultas repetidas y permite encadenar lógica en pasos claros.
Descripción
Las expresiones de tabla común (CTE) introducen WITH nombre AS (subconsulta) y luego referencian ese nombre como una tabla en el SELECT principal u otras CTE. Puedes declarar varias separadas por coma o encadenar dependencias. Algunos motores optimizan CTE como vistas inline; otros materializan según hints o versión. Las CTE recursivas (WITH RECURSIVE en PostgreSQL, sintaxis propia en SQL Server) modelan grafos o jerarquías. Usa CTE cuando la consulta sería ilegible con subconsultas anidadas profundas.
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 nombre AS (
SELECT ...
)
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.
- WITH
- Encabeza la lista de CTE; cada una tiene un identificador y opcionalmente columnas explícitas (nombre(col1,col2)).
- AS (subconsulta)
- Define el conjunto de filas de la CTE; puede referenciar CTE anteriores en la misma lista.
- Recursivas
- Parte ancla + UNION ALL con parte recursiva que referencia la propia CTE; requiere condición de terminación para no ciclar infinitamente.
Ejemplos
Ejemplo 1
WITH activos AS (
SELECT id, nombre FROM usuarios WHERE activo = 1
)
SELECT * FROM activos WHERE id > 100;
Ejemplo 2
WITH uno AS (SELECT 1 AS n)
SELECT n + 1 FROM uno;
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.