Fernando
← Blog

· 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.