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
WITH nombre_cte AS (
SELECT ...
)
SELECT ...
FROM nombre_cte;Ejemplo guiado
| id | cliente_id | total | estado |
|---|---|---|---|
| 101 | 1 | 65 | enviado |
| 102 | 2 | 189 | pendiente |
| 103 | 1 | 44 | enviado |
| 105 | 5 | 118 | enviado |
Lee primero la consulta e intenta predecir el resultado:
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;| cliente_id | total_enviado |
|---|---|
| 1 | 109 |
| 5 | 118 |
Qué ocurre paso a paso
- La CTE
pedidos_enviadosconserva únicamente pedidos con estado enviado. - La consulta principal trabaja con ese resultado ya filtrado.
GROUP BYreúne los pedidos por cliente.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
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
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.
Solución razonada
WITH productos_con_stock AS (
SELECT nombre, precio
FROM productos
WHERE stock > 0
)
SELECT nombre, precio
FROM productos_con_stock
ORDER BY precio;El primer bloque resuelve una tarea concreta: identificar productos disponibles. La consulta exterior decide cómo presentar ese conjunto. Esta separación facilita comprobar cada razonamiento sin convertir la CTE en un objeto permanente.
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.