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 NULLO 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.idCombinando 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 —
UNIONelimina 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-chaveRECURSIVEé implícita, e ele impõe um valor padrão deMAXRECURSIONigual 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, acompanhedepthepathe 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
- Membros âncora e recursivos
- Percorrendo um organograma
- Gerando séries de números e datas
- Evitando recursão infinita