0Pricing
Coding Interview Prep · Aula

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 Coding 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 Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding 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 WITH no 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.

  • spend e big_spenders são melhores que step1 e step2.
  • 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding 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 Coding 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 Coding Interview Prep?

Nenhuma experiência prévia é necessária. Coding 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 Coding Interview Prep?

Sim. Cada aula de Coding 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

  1. Escrevendo sua primeira CTE
  2. Encadeando várias CTEs
  3. CTE versus subconsulta versus tabela temporária
  4. Refatorando consultas aninhadas em CTEs
← Voltar para Coding Interview Prep