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:

  1. Consulta base: El conjunto inicial de filas
  2. 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 RECURSIVE permite 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.