0Pricing
Coding Interview Prep · Aula

Membros âncora e recursivos

Entenda a estrutura em duas partes de uma CTE recursiva e como funciona a terminação.

Membros âncora e recursivos é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 1 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 CTEs recursivas aparecem

Quando um entrevistador apresenta a você um organograma, uma lista de materiais ou uma árvore de categorias e pede todos os descendentes, ele está testando se você recorre a uma CTE recursiva. Junções simples só conseguem percorrer uma quantidade fixa de níveis; a recursão percorre uma profundidade arbitrária.

A expressão reveladora em uma pergunta é "até qualquer profundidade" ou "até o fim". Essa é a sua deixa. Nesta lição, você aprenderá a estrutura de duas partes compartilhada por toda CTE recursiva: a âncora e o membro recursivo.

A estrutura de duas partes

Uma CTE recursiva sempre tem a palavra-chave WITH RECURSIVE (PostgreSQL, SQLite, MySQL 8+; o SQL Server omite RECURSIVE) e um corpo formado por duas consultas combinadas por UNION ALL:

  • Membro âncora — as linhas iniciais, executado uma vez.
  • Membro recursivo — faz referência ao próprio nome da CTE e é executado repetidamente.

Memorize essa estrutura; os entrevistadores adoram pedir que você a escreva do zero.

WITH RECURSIVE cte AS (
    -- anchor member
    SELECT ...
    UNION ALL
    -- recursive member
    SELECT ... FROM cte JOIN ...
)
SELECT * FROM cte;

O que a âncora faz

O membro âncora é uma consulta comum sem referência à CTE. Ele produz as linhas iniciais, o ponto de partida do nível zero. Em um organograma, geralmente é o CEO (a linha cujo gerente é NULL); em uma sequência numérica, é o primeiro número.

A âncora é executada exatamente uma vez. Sua saída se torna o primeiro lote de linhas enviado à etapa recursiva.

-- Anchor: the top of the hierarchy
SELECT id, name, manager_id, 1 AS depth
FROM employees
WHERE manager_id IS NULL

O que o membro recursivo faz

O membro recursivo faz referência à CTE pelo nome. A cada iteração, ele combina as linhas produzidas pela iteração anterior com a tabela base para encontrar o próximo nível abaixo.

Ele não enxerga toda a CTE acumulada até o momento — apenas as linhas adicionadas na etapa imediatamente anterior. Esse é o modelo mental fundamental que os entrevistadores procuram avaliar.

-- Recursive: children of the rows found so far
SELECT e.id, e.name, e.manager_id, c.depth + 1
FROM employees e
JOIN cte c ON e.manager_id = c.id

Combinando as partes

Combine os membros âncora e recursivo com UNION ALL, e o mecanismo fará as iterações automaticamente. Cada passagem acrescenta o próximo nível até que o membro recursivo retorne zero linhas; nesse momento, a recursão para.

A seguir, há uma consulta completa e executável que percorre um organograma e também acompanha depth.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 1 AS depth
    FROM employees
    WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1
    FROM employees e
    JOIN org o ON e.manager_id = o.id
)
SELECT id, name, depth FROM org ORDER BY depth, id;

Como funciona a terminação

A recursão para quando o membro recursivo não produz novas linhas. Não é necessário um contador de laço explícito — a junção naturalmente deixa de encontrar resultados quando você chega às folhas da árvore.

No exemplo do organograma, quando você chega a funcionários sem subordinados diretos, a junção da próxima iteração não encontra filhos, retorna um resultado vazio e o mecanismo para. Entender esse comportamento de autoencerramento é uma pergunta clássica de acompanhamento.

UNION ALL versus UNION

Os entrevistadores costumam perguntar por que usamos UNION ALL e não UNION. Há dois motivos:

  • Desempenho — UNION elimina duplicatas a cada iteração, o que é caro.
  • Correção — em uma árvore, linhas duplicadas geralmente não podem ocorrer, portanto eliminar duplicatas é trabalho desperdiçado.

Use UNION somente quando a estrutura for um grafo e você quiser deliberadamente consolidar nós repetidos — mas, para garantir segurança contra ciclos, é melhor usar proteções explícitas (abordadas mais adiante).

Acompanhando a profundidade e o caminho

Duas colunas adicionais tornam os resultados recursivos muito mais úteis e são frequentemente solicitadas em entrevistas:

  • depth — comece em 1 na âncora e adicione 1 no membro recursivo.
  • path — acumule a cadeia de identificadores ou nomes para que você possa ver o caminho da raiz até o nó.

Construir path como uma string também serve como ferramenta de detecção de ciclos mais adiante.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 1 AS depth,
           CAST(name AS VARCHAR(1000)) AS path
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1,
           o.path || ' > ' || e.name
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, depth, path FROM org;

Os tipos das colunas devem corresponder

Uma armadilha sutil: o membro âncora e o membro recursivo devem retornar o mesmo número de colunas com tipos compatíveis. Se você criar uma string path, o valor inicial da âncora deve ser convertido para um tipo amplo o suficiente (por exemplo, VARCHAR(1000)), ou o mecanismo poderá truncar o valor ou lançar um erro de incompatibilidade de tipos nas iterações seguintes.

Esse é exatamente o tipo de detalhe que um entrevistador introduz para verificar se você realmente executou uma CTE recursiva, em vez de apenas ter lido sobre ela.

Exemplo de lista de materiais

A mesma estrutura resolve uma lista de materiais: dado um componente, liste todas as subpeças em qualquer profundidade. A âncora seleciona o conjunto principal; o membro recursivo percorre os vínculos de parent_part para child_part.

Observe que a estrutura é idêntica à do organograma — apenas os nomes das colunas mudam. Reconhecer que uma única estrutura se aplica a muitos problemas é a verdadeira habilidade para entrevistas.

WITH RECURSIVE bom AS (
    SELECT child_part, parent_part, 1 AS lvl
    FROM parts WHERE parent_part = 'ENGINE'
    UNION ALL
    SELECT p.child_part, p.parent_part, b.lvl + 1
    FROM parts p JOIN bom b ON p.parent_part = b.child_part
)
SELECT child_part, lvl FROM bom;

Observações sobre dialetos

Um resumo rápido entre dialetos que os entrevistadores apreciam:

  • PostgreSQL, SQLite, MySQL 8+: WITH RECURSIVE name AS (...).
  • SQL Server: basta usar WITH name AS (...) — a palavra-chave RECURSIVE é implícita, e ele impõe um valor padrão de MAXRECURSION igual a 100.
  • Oracle: oferece suporte tanto a CTEs recursivas quanto à sintaxe mais antiga CONNECT BY.

Dizer "o SQL Server não usa a palavra RECURSIVE" demonstra conhecimento abrangente.

Verificação rápida

Teste sua compreensão da estrutura de duas partes.

Recapitulação

Agora você domina a estrutura de uma CTE recursiva:

  • WITH RECURSIVE + âncora + UNION ALL + membro recursivo.
  • A âncora inicializa o nível zero e é executada uma vez.
  • O membro recursivo combina a iteração anterior com a tabela base e continua até não retornar nenhuma linha.
  • Use UNION ALL, acompanhe depth e path e mantenha os tipos das colunas compatíveis.

Próximo passo: aplicar essa estrutura para percorrer um organograma real para baixo e para cima.

Perguntas Frequentes

A aula “Membros âncora e recursivos” é grátis?

Sim — o texto completo de “Membros âncora e recursivos” é 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 “Membros âncora e recursivos”?

Entenda a estrutura em duas partes de uma CTE recursiva e como funciona a terminação. 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 1 de 4.

Quanto tempo leva a aula “Membros âncora e recursivos”?

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. Membros âncora e recursivos
  2. Percorrendo um organograma
  3. Gerando séries de números e datas
  4. Evitando recursão infinita
← Voltar para Coding Interview Prep