· 2 min de leitura
CTE no SQL deixa a consulta legível
Como usar WITH para quebrar uma consulta grande em etapas com nome, e quando isso ajuda de verdade.
- #SQL
Toda pessoa que trabalha com dados já abriu uma consulta com três níveis de subconsulta e precisou de alguns minutos para entender o que ela fazia. A CTE (Common Table Expression) resolve boa parte disso.
O que é
Uma CTE é um resultado temporário com nome, definido com WITH antes da consulta principal. Ela existe só durante a execução daquela consulta.
Antes: subconsultas aninhadas
SELECT loja, total
FROM (
SELECT loja, SUM(valor) AS total
FROM (
SELECT * FROM vendas WHERE data >= '2026-01-01'
) v
GROUP BY loja
) t
WHERE total > 100000;
Depois: com CTE
WITH vendas_2026 AS (
SELECT * FROM vendas
WHERE data >= '2026-01-01'
),
total_por_loja AS (
SELECT loja, SUM(valor) AS total
FROM vendas_2026
GROUP BY loja
)
SELECT loja, total
FROM total_por_loja
WHERE total > 100000;
O resultado é o mesmo, mas agora a lógica se lê de cima para baixo, e cada etapa tem um nome que explica o que ela faz.
Quando usar
- Quando a consulta tem mais de uma etapa de transformação.
- Quando o mesmo resultado intermediário é usado mais de uma vez.
- Quando outra pessoa (ou você daqui a seis meses) vai precisar manter o código.
Um cuidado
Em alguns bancos, a CTE não é armazenada: ela é recalculada cada vez que é referenciada. Em consultas muito pesadas, vale comparar o plano de execução com o de uma tabela temporária.