Encadenar varios CTE
Construya una secuencia de pasos con nombre que hagan referencia entre sí
Encadenar varios CTE es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.
Por qué encadenar CTE
Los problemas reales de las entrevistas rara vez se resuelven en un solo paso. Encadenar CTE le permite construir un flujo de etapas con nombre, donde cada etapa transforma el resultado de la anterior. Esto refleja cómo un ingeniero sénior divide una consulta compleja en partes manejables.
En lugar de anidar subconsultas hasta tres niveles de profundidad, escribe cada paso una sola vez, le asigna un nombre y permite que los pasos posteriores hagan referencia a él.
La sintaxis separada por comas
Para definir varios CTE, escriba WITH una sola vez y separe cada bloque con nombre mediante una coma. No debe repetir la palabra clave WITH.
- Un solo
WITHal principio. - Una coma entre cada definición de CTE.
- Ninguna coma antes de la consulta principal final.
WITH a AS (
SELECT customer_id FROM orders
),
b AS (
SELECT customer_id FROM a
)
SELECT *
FROM b;Los CTE posteriores pueden hacer referencia a los anteriores
Esta es la potencia de encadenarlos: un CTE puede leer cualquier CTE definido antes que él. Esta visibilidad únicamente hacia adelante le permite construir una cadena de dependencias.
Un CTE anterior no puede ver uno posterior, por lo que el orden importa. Organice las etapas desde los datos sin procesar hasta la forma final.
WITH filtered AS (
SELECT *
FROM events
WHERE event_type = 'purchase'
),
per_user AS (
SELECT user_id, COUNT(*) AS purchases
FROM filtered
GROUP BY user_id
)
SELECT *
FROM per_user;Ejemplo resuelto: flujo de tres etapas
Pregunta: entre los clientes que gastaron más de 1000 dólares, ¿cuál es el gasto medio? Divídalo en tres etapas: calcular el gasto total por cliente, filtrar a quienes más gastan y, por último, calcular su promedio.
El nombre de cada CTE documenta su propósito, por lo que quien revise la consulta entiende el flujo de inmediato.
WITH spend AS (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
),
big_spenders AS (
SELECT customer_id, total
FROM spend
WHERE total > 1000
)
SELECT AVG(total) AS avg_big_spend
FROM big_spenders;El orden de definición importa
Como la visibilidad es únicamente hacia adelante, un CTE que depende de otro debe aparecer después de su dependencia. Si hace referencia a un nombre que aún no se ha definido, la base de datos genera un error de «relation does not exist».
Un buen hábito consiste en leer la lista de CTE de arriba abajo y confirmar que cada nombre utilizado ya ha aparecido anteriormente.
Hacer referencia a un CTE desde varios otros
Un solo CTE puede alimentar a varios CTE posteriores. Aquí es donde encadenarlos supera a las subconsultas anidadas: calcula el resultado base una sola vez y crea ramas a partir de él.
Aquí, tanto active como recent leen de base, lo que evita duplicar la lógica.
WITH base AS (
SELECT * FROM users WHERE deleted = false
),
active AS (
SELECT id FROM base WHERE last_login > NOW() - INTERVAL '7 days'
),
recent AS (
SELECT id FROM base WHERE created_at > NOW() - INTERVAL '30 days'
)
SELECT (SELECT COUNT(*) FROM active) AS active_cnt,
(SELECT COUNT(*) FROM recent) AS recent_cnt;Unir dos CTE
Los CTE encadenados suelen unirse en la consulta principal. Calcule cada lado por separado y después combínelos. Así cada cálculo permanece aislado y la unión resulta sencilla.
A continuación calculamos por separado el número de pedidos y el número de reembolsos, y después los unimos por cliente.
WITH orders_cte AS (
SELECT customer_id, COUNT(*) AS orders
FROM orders GROUP BY customer_id
),
refunds_cte AS (
SELECT customer_id, COUNT(*) AS refunds
FROM refunds GROUP BY customer_id
)
SELECT o.customer_id, o.orders, COALESCE(r.refunds, 0) AS refunds
FROM orders_cte o
LEFT JOIN refunds_cte r ON r.customer_id = o.customer_id;Legibilidad frente a anidamiento
Compare una subconsulta anidada en tres niveles con un flujo de tres CTE. La versión anidada obliga a quien la lee a deshacer mentalmente el anidamiento desde dentro hacia fuera. La versión con CTE se lee en el orden de ejecución, de arriba abajo.
Los entrevistadores valoran el enfoque con CTE porque es el que querrían mantener en producción. Nombrar cada etapa es documentación que nunca queda obsoleta.
Un error común al encadenar
Los principiantes suelen añadir una coma después del último CTE, justo antes del SELECT principal. Esa coma final provoca un error de sintaxis.
- Las comas van entre las definiciones de los CTE únicamente.
- Después del paréntesis de cierre final va directamente la consulta principal, sin coma.
Otra trampa consiste en olvidar que cada CTE necesita su propio SELECT completo dentro de los paréntesis.
¿Se ejecuta cada etapa por separado?
Un matiz importante en las entrevistas: lógicamente, el flujo se lee como una serie de pasos diferenciados, pero el optimizador puede insertarlos y fusionarlos en un único plan de ejecución. En la mayoría de los motores, no está obligado a pagar el coste de materializar los resultados intermedios.
Por tanto, encadenar CTE le ayuda a razonar sobre la consulta sin que ello suponga necesariamente un coste de rendimiento. Mencione este detalle para demostrar un conocimiento profundo.
Nombrar las etapas como un flujo
Unos buenos nombres para las etapas convierten una consulta en código autodocumentado. Prefiera nombres que describan el resultado de cada paso, no la operación.
spendybig_spendersson mejores questep1ystep2.- Quien lea la consulta debería poder deducir todo el flujo solo a partir de los nombres de los CTE.
- Una nomenclatura coherente entre las etapas hace evidente la unión de la consulta principal.
En una entrevista, nombrar claramente las etapas demuestra que sabe escribir SQL de producción fácil de mantener.
Comprobación rápida
Compruebe hasta qué punto entiende cómo los CTE encadenados hacen referencia unos a otros.
Repaso: encadenar CTE
Ha aprendido a construir flujos: un solo WITH, definiciones de CTE separadas por comas y visibilidad únicamente hacia adelante, de modo que cada etapa puede leer las etapas anteriores.
- Ordene los CTE desde los datos sin procesar hasta el resultado final.
- Reutilice un CTE base en varios pasos posteriores.
- No añada una coma final antes de la consulta principal.
- Encadenar CTE mejora la legibilidad sin perjudicar necesariamente el rendimiento.
A continuación: comparar CTE con subconsultas y tablas temporales.
Preguntas frecuentes
¿La lección «Encadenar varios CTE» es gratis?
Sí — el texto completo de «Encadenar varios CTE» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «Encadenar varios CTE»?
Construya una secuencia de pasos con nombre que hagan referencia entre sí Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Coding Interview Prep?
No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Encadenar varios CTE»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?
Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Escribir su primer CTE
- Encadenar varios CTE
- CTE frente a subconsulta frente a tabla temporal
- Refactorizar consultas anidadas en CTE