Tutorial de SQL

Cómo usar WITH (CTE) en SQL

WITH, también llamado CTE o expresión de tabla común, te deja escribir primero una consulta, ponerle nombre y después usarla como si fuera una tabla. Así una consulta complicada se resuelve por pasos y se lee de arriba hacia abajo. Aquí verás la sintaxis, un ejemplo resuelto con promedios por alumno y el detalle del punto y coma en SQL Server.

WITH: ponle nombre a un paso intermedio

Cuando una consulta se complica, conviene resolverla por pasos. WITH (también llamado CTE, «expresión de tabla común») te deja escribir primero una consulta, ponerle nombre y luego usarla como si fuera una tabla.

Ya hiciste algo parecido con tablas derivadas (una subconsulta en el FROM). WITH hace lo mismo, pero el paso queda arriba y con nombre, así la consulta se lee de arriba hacia abajo.

El resultado de WITH solo existe mientras corre esa consulta: no se guarda en la base.

Cómo se escribe

WITH paso AS ( SELECT … ) SELECT … FROM paso

WITH paso AS (…)
calcula un resultado y le pone nombre (paso)
SELECT … FROM paso
la consulta final usa ese resultado como una tabla
JOIN
puedes unir el paso con otras tablas, como cualquier tabla

Ejemplo resuelto

WITH prom AS (SELECT alumno_id, AVG(calificacion) AS promedio_real FROM calificaciones GROUP BY alumno_id) SELECT a.nombre, ROUND(p.promedio_real, 2) AS promedio_real FROM prom p JOIN alumnos a ON a.id = p.alumno_id WHERE p.promedio_real > 9 ORDER BY p.promedio_real DESC
Número de fila#nombrepromedio_real
1Regina Salinas9.83
2Valeria Núñez9.43
3Sebastián Lara9.07

Promedio de calificaciones por alumno (paso 1) y, después, solo los que pasan de 9, con su nombre.

En SQL Server: En SQL Server se escribe igual. Si antes de WITH hay otra instrucción, termina esa con punto y coma (;WITH …).

  • Ejecuta primero solo el SELECT de adentro: si ese paso está bien, lo demás es más fácil.
  • Después del paréntesis de WITH no va punto y coma: sigue directo la consulta final.
  • Filtra por el total en la consulta final (WHERE), no en el paso: ahí el total ya existe como columna.

Preguntas frecuentes

¿Qué es un CTE en SQL?

Una «expresión de tabla común»: un resultado con nombre que defines con WITH y usas en la consulta final como una tabla. Solo existe mientras corre esa consulta; no se guarda en la base.

¿Qué diferencia hay entre WITH y una subconsulta en el FROM?

Hacen lo mismo, pero con WITH el paso queda arriba y con nombre, así la consulta se lee de arriba hacia abajo.

¿Por qué SQL Server marca error en mi WITH?

Si antes de WITH hay otra instrucción, esa debe terminar en punto y coma. Por eso a veces verás ;WITH.