Consultas · Microlección

WITH y CTE

Define uno o varios resultados auxiliares con nombre para utilizarlos dentro de una única sentencia SQL.

Lectura: 11–16 minEjemplo paso a pasoPráctica con pistas

Qué significa

Una CTE, abreviatura de common table expression o expresión de tabla común, es un resultado auxiliar definido al comienzo de una sentencia mediante WITH. Puede consultarse por su nombre dentro de esa sentencia, como si fuera una tabla temporal de alcance local.

Qué problema resuelve

Cuando una consulta contiene varios niveles de subconsultas, resulta difícil explicar qué calcula cada parte. WITH permite nombrar pasos intermedios. Esto puede mejorar la legibilidad y reutilizar el mismo resultado dentro de la sentencia, aunque no implica automáticamente una consulta más rápida.

Apréndelo en contexto: este término se relaciona directamente con Subconsultas: usar el resultado de otra consulta.

Sintaxis básica

Estructura
WITH nombre_cte AS (
  SELECT ...
)
SELECT ...
FROM nombre_cte;

Ejemplo guiado

Datos de ejemplo: pedidos
idcliente_idtotalestado
101165enviado
1022189pendiente
103144enviado
1055118enviado

Lee primero la consulta e intenta predecir el resultado:

SQL
WITH pedidos_enviados AS (
  SELECT cliente_id, total
  FROM pedidos
  WHERE estado = 'enviado'
)
SELECT cliente_id, SUM(total) AS total_enviado
FROM pedidos_enviados
GROUP BY cliente_id
ORDER BY cliente_id;
Resultado esperado
cliente_idtotal_enviado
1109
5118

Qué ocurre paso a paso

  1. La CTE pedidos_enviados conserva únicamente pedidos con estado enviado.
  2. La consulta principal trabaja con ese resultado ya filtrado.
  3. GROUP BY reúne los pedidos por cliente.
  4. SUM(total) calcula 109 para el cliente 1 y 118 para el cliente 5.

Error frecuente

Creer que una CTE queda guardada para consultas posteriores

Consulta problemática
WITH enviados AS (SELECT * FROM pedidos WHERE estado = 'enviado');
SELECT * FROM enviados;

La definición WITH debe formar parte de la misma sentencia que la utiliza. Una CTE normal solo existe durante esa sentencia; no crea una vista ni una tabla permanente. Para reutilización duradera, estudia las vistas.

Mini práctica

Básica · apoyo graduado

Aplica el concepto

Crea una CTE llamada productos_con_stock que seleccione nombre y precio de productos con stock mayor que cero. Después consulta esa CTE ordenando por precio.

Compatibilidad y matices

WITH está disponible en los principales motores actuales, pero las versiones antiguas y las funciones avanzadas pueden diferir. Las CTE recursivas utilizan WITH RECURSIVE en varios motores y requieren una explicación propia. El optimizador también puede materializar o integrar una CTE de forma diferente; utiliza WITH principalmente por claridad y verifica el plan cuando el rendimiento sea importante.

Recuerda

  • Define uno o varios resultados auxiliares con nombre para utilizarlos dentro de una única sentencia SQL.
  • Comprueba siempre los datos de entrada y el resultado esperado.
  • Cuando el comportamiento dependa del motor, consulta su documentación oficial.

Conceptos relacionados

Fuentes técnicas consultadas

Estas fuentes se utilizaron para comprobar la definición y los matices técnicos. El contenido de esta página está redactado de forma original para el aprendizaje.