Encadeando várias CTEs
Crie um fluxo de etapas nomeadas que façam referência umas às outras.
Encadeando várias CTEs é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.
Por que encadear CTEs
Problemas reais de entrevistas raramente cabem em uma única etapa. Encadear CTEs permite criar um fluxo de etapas nomeadas, em que cada etapa transforma a saída da etapa anterior. Isso reflete a forma como um engenheiro sênior divide uma consulta complexa em partes gerenciáveis.
Em vez de aninhar subconsultas em três níveis, você escreve cada etapa uma vez, dá um nome a ela e permite que as etapas posteriores a referenciem.
A sintaxe separada por vírgulas
Para definir várias CTEs, você escreve WITH uma vez e depois separa cada bloco nomeado com uma vírgula. Você não repete a palavra-chave WITH.
- Um
WITHno início. - Uma vírgula entre cada definição de CTE.
- Nenhuma vírgula antes da consulta principal.
WITH a AS (
SELECT customer_id FROM orders
),
b AS (
SELECT customer_id FROM a
)
SELECT *
FROM b;CTEs posteriores podem referenciar as anteriores
Esse é o poder do encadeamento: uma CTE pode ler qualquer CTE definida antes dela. Essa visibilidade somente para frente permite criar uma cadeia de dependências.
Uma CTE anterior não pode enxergar uma posterior, portanto a ordem é importante. Organize suas etapas dos dados brutos até o formato 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;Exemplo resolvido: fluxo em três etapas
Pergunta: entre os clientes que gastaram mais de mil dólares, qual é o gasto médio? Divida o problema em três etapas: gasto total por cliente, filtragem dos clientes de alto gasto e, por fim, cálculo da média.
O nome de cada CTE documenta sua finalidade, para que um revisor entenda imediatamente o fluxo.
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;A ordem das definições é importante
Como a visibilidade ocorre somente para frente, uma CTE que depende de outra deve ser listada depois da sua dependência. Se você referenciar um nome que ainda não foi definido, o banco de dados emitirá um erro de “relação não existe”.
Um bom hábito é ler sua lista de CTEs de cima para baixo e confirmar que cada nome usado já apareceu acima.
Referenciando uma CTE a partir de várias outras
Uma única CTE pode alimentar várias CTEs posteriores. É nesse ponto que o encadeamento supera as subconsultas aninhadas: você calcula um resultado base uma vez e cria ramificações a partir dele.
Aqui, tanto active quanto recent leem de base, evitando lógica duplicada.
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;Unindo duas CTEs
CTEs encadeadas são frequentemente unidas na consulta principal. Calcule cada lado separadamente e depois combine-os. Isso mantém cada cálculo isolado e a junção simples.
A seguir, calculamos de forma independente as contagens de pedidos e de reembolsos e depois as 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;Legibilidade em vez de aninhamento
Compare uma subconsulta aninhada em três níveis com um fluxo de três CTEs. A versão aninhada obriga o leitor a desvendá-la mentalmente de dentro para fora. A versão com CTEs segue a ordem de execução, de cima para baixo.
Entrevistadores valorizam a abordagem com CTEs porque é o que desejariam manter em produção. Dar um nome a cada etapa é uma documentação que nunca fica desatualizada.
Um erro comum ao encadear
Iniciantes frequentemente adicionam uma vírgula depois da última CTE, imediatamente antes do SELECT principal. Essa vírgula final é um erro de sintaxe.
- As vírgulas aparecem entre as definições de CTE, e somente entre elas.
- O parêntese de fechamento final é seguido diretamente pela consulta principal, sem vírgula.
Outra armadilha é esquecer que cada CTE precisa do seu próprio SELECT completo dentro dos parênteses.
Cada etapa é executada separadamente?
Um ponto sutil em entrevistas: logicamente, o fluxo é lido como etapas distintas, mas o otimizador pode incorporá-las e combiná-las em um único plano de execução. Na maioria dos mecanismos, você não precisa arcar com o custo da materialização intermediária.
Assim, o encadeamento ajuda você a raciocinar sobre a consulta sem necessariamente prejudicar o desempenho. Mencione isso para demonstrar conhecimento aprofundado.
Nomeando etapas como um fluxo
Bons nomes de etapas transformam uma consulta em código autoexplicativo. Prefira nomes que descrevam a saída de cada etapa, e não a operação.
spendebig_spenderssão melhores questep1estep2.- O leitor deve conseguir deduzir todo o fluxo apenas pelos nomes das CTEs.
- Nomes consistentes entre as etapas tornam óbvia a junção na consulta principal.
Em uma entrevista, nomear as etapas com clareza indica que você escreve SQL de produção sustentável.
Verificação rápida
Verifique sua compreensão de como CTEs encadeadas referenciam umas às outras.
Recapitulação: encadeando CTEs
Você aprendeu a criar fluxos: um único WITH, definições de CTE separadas por vírgulas e visibilidade somente para frente, em que cada etapa pode ler as etapas anteriores.
- Ordene as CTEs dos dados brutos até o resultado final.
- Reutilize uma CTE base em várias etapas posteriores.
- Nenhuma vírgula final antes da consulta principal.
- O encadeamento melhora a legibilidade sem necessariamente prejudicar o desempenho.
Em seguida: comparação entre CTEs, subconsultas e tabelas temporárias.
Perguntas Frequentes
A aula “Encadeando várias CTEs” é grátis?
Sim — o texto completo de “Encadeando várias CTEs” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.
O que vou aprender em “Encadeando várias CTEs”?
Crie um fluxo de etapas nomeadas que façam referência umas às outras. Você pratica SQL Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Interview Prep?
Nenhuma experiência prévia é necessária. SQL Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Encadeando várias CTEs”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Interview Prep?
Sim. Cada aula de SQL Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Escrevendo sua primeira CTE
- Encadeando várias CTEs
- CTE versus subconsulta versus tabela temporária
- Refatorando consultas aninhadas em CTEs