Cláusula SQL WITH: Expresiones de Tabla Comunes (CTE) y Consultas Recursivas
Published: 2026-02-04
La cláusula WITH (también llamada Expresión de Tabla Común o CTE, por sus siglas en inglés) te permite definir conjuntos de resultados temporales con nombre a los que puedes hacer referencia en una consulta. Esto hace que las consultas complejas sean más legibles y reutilizables. Está disponible en la mayoría de las bases de datos SQL modernas, incluidas SQLite, PostgreSQL, MySQL 8.0+, SQL Server y Oracle.
Datos de ejemplo
Usamos dos tablas en todos los ejemplos:
Tabla employees:
| id | name | manager_id | salary |
|---|---|---|---|
| 1 | Alice | NULL | 120000 |
| 2 | Bob | 1 | 80000 |
| 3 | Carol | 1 | 85000 |
| 4 | Dave | 2 | 60000 |
| 5 | Eve | 2 | 62000 |
| 6 | Frank | 3 | 58000 |
Tabla sales:
| id | employee_id | amount | month |
|---|---|---|---|
| 1 | 2 | 5000 | January |
| 2 | 2 | 6000 | February |
| 3 | 3 | 7000 | January |
| 4 | 3 | 8000 | February |
| 5 | 4 | 3000 | January |
| 6 | 5 | 4000 | January |
| 7 | 6 | 2500 | February |
Cláusula WITH básica (no recursiva)
Una cláusula WITH define una o más tablas temporales con nombre que existen solo durante la ejecución de la consulta.
Ejemplo: Ventas totales por empleado
La CTE employee_sales calcula las ventas totales por empleado y luego la unimos con la tabla employees para mostrar los nombres.
Múltiples CTE
Puedes definir múltiples CTE separadas por comas. Las CTE posteriores pueden hacer referencia a las anteriores.
Ejemplo: Análisis de ventas con múltiples métricas
WITH RECURSIVE: Recorrer jerarquías
WITH RECURSIVE permite que una CTE se haga referencia a sí misma, lo que te permite recorrer datos jerárquicos o en forma de árbol. Esto es útil para organigramas, jerarquías de categorías o cualquier relación padre-hijo.
Una CTE recursiva tiene dos partes:
- Consulta base: El conjunto inicial de filas
- Consulta recursiva: Hace referencia a la propia CTE para encontrar filas relacionadas
Ejemplo: Organigrama (todos los empleados bajo un gerente)
Encuentra todos los empleados bajo Alice (la CEO):
Ejemplo: Cadena de mando (encontrar la jerarquía de gerentes)
Encuentra la cadena de mando completa de Dave (que reporta a Bob, que reporta a Alice):
Sintaxis de WITH RECURSIVE en distintas bases de datos
WITH RECURSIVE es compatible con:
- SQLite — 3.8.3+ (2013)
- PostgreSQL — 8.4+ (2009)
- SQL Server — 2005+ (llamado “Recursive CTE”)
- Oracle — 11g+ (llamado “Recursive Subquery Factoring”)
- MySQL — 8.0+ (2018)
Nota: Las versiones antiguas de MySQL y algunas otras bases de datos no admiten CTE recursivas; pueden requerir enfoques diferentes como procedimientos almacenados o recursión a nivel de aplicación.
Casos de uso comunes de las cláusulas WITH
- Simplificar consultas complejas: Divide una consulta grande en pasos lógicos
- Reutilizar subconsultas: Define un cálculo una vez y úsalo varias veces
- Recorrido jerárquico: Navegar árboles (organigramas, categorías, comentarios)
- Generar secuencias: Crear rangos de números o rangos de fechas
- Agregaciones progresivas: Construir resultados por etapas
Resumen
WITH(CTE) crea un conjunto de resultados temporal con nombre para usar en una consulta- Se pueden encadenar múltiples CTE
WITH RECURSIVEpermite que una CTE se haga referencia a sí misma para consultas jerárquicas- Las CTE recursivas requieren un caso base y un caso recursivo separados por
UNION ALL - Es compatible con todas las bases de datos SQL modernas (aunque la sintaxis puede variar ligeramente)
Prueba a modificar los ejemplos anteriores para explorar distintas jerarquías o cálculos.