CTEs RECURSIVE para hierarquias
Percorra dados hierárquicos (organogramas, comentários encadeados e travessia de grafos) com WITH RECURSIVE e condições de parada.
CTEs RECURSIVE para hierarquias é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 4 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 Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Por que usar recursão?
O SQL comum não consegue percorrer uma árvore de profundidade desconhecida: pais dos pais, filhos dos filhos. CTEs recursivas são a solução do SQL padrão.
Anatomia
Uma CTE recursiva tem duas partes unidas por UNION ALL:
WITH RECURSIVE name AS (
-- 1. Anchor query: seed rows
SELECT ...
UNION ALL
-- 2. Recursive step: references the CTE itself
SELECT ...
FROM name JOIN ...
)
SELECT * FROM name;Percorrendo um Organograma
Encontre todos os funcionários que respondem, direta ou indiretamente, a um determinado gerente:
WITH RECURSIVE reports AS (
-- anchor: the manager themself
SELECT id, full_name, manager_id, 0 AS depth
FROM employees WHERE id = 42
UNION ALL
-- recurse: people whose manager is in reports
SELECT e.id, e.full_name, e.manager_id, r.depth + 1
FROM employees e
JOIN reports r ON r.id = e.manager_id
)
SELECT * FROM reports ORDER BY depth, full_name;Comentários Encadeados
Percorra uma árvore de discussão a partir de uma raiz:
WITH RECURSIVE thread AS (
SELECT id, parent_id, body, 0 AS depth, ARRAY[id] AS path
FROM comments WHERE id = $1
UNION ALL
SELECT c.id, c.parent_id, c.body, t.depth + 1, t.path || c.id
FROM comments c
JOIN thread t ON c.parent_id = t.id
)
SELECT * FROM thread ORDER BY path;Terminação
A recursão para quando a etapa recursiva não retorna novas linhas.
Evitando Loops Infinitos
Se o seu grafo tiver ciclos, acompanhe os nós visitados:
WITH RECURSIVE walk AS (
SELECT id, ARRAY[id] AS path FROM nodes WHERE id = $1
UNION ALL
SELECT e.target_id, w.path || e.target_id
FROM edges e
JOIN walk w ON e.source_id = w.id
WHERE e.target_id <> ALL(w.path)
)
SELECT * FROM walk;Série Numérica
CTEs recursivas também podem gerar sequências:
WITH RECURSIVE n(i) AS (
VALUES (1)
UNION ALL
SELECT i + 1 FROM n WHERE i < 100
)
SELECT i, i*i AS square FROM n;Lista de Materiais
Expanda um produto para obter todos os componentes, incluindo subconjuntos:
WITH RECURSIVE bom AS (
SELECT part_id, sub_part_id, qty FROM parts WHERE part_id = $1
UNION ALL
SELECT p.part_id, p.sub_part_id, p.qty * bom.qty
FROM parts p
JOIN bom ON bom.sub_part_id = p.part_id
)
SELECT sub_part_id, SUM(qty) AS total_qty FROM bom GROUP BY sub_part_id;Limites de Profundidade
Por segurança, limite a profundidade da recursão:
WITH RECURSIVE tree AS (
SELECT id, parent_id, 0 AS depth FROM nodes WHERE id = $1
UNION ALL
SELECT n.id, n.parent_id, t.depth + 1
FROM nodes n JOIN tree t ON n.parent_id = t.id
WHERE t.depth < 10
)
SELECT * FROM tree;UNION vs UNION ALL
UNION ALL é a escolha habitual. UNION elimina duplicatas — útil quando um nó pode ser alcançado por vários caminhos.
Desempenho
CTEs recursivas são avaliadas iterativamente. A cada etapa, a "tabela de trabalho" é formada pelas linhas produzidas pela etapa anterior. Crie índices nas colunas usadas no JOIN.
Recapitulação
CTEs recursivas percorrem hierarquias e grafos.
- Âncora + UNION ALL + etapa recursiva
- Param quando a etapa recursiva não retorna linhas
- Use um vetor de caminho para interromper ciclos
Verificação rápida
Qual palavra-chave transforma uma CTE em uma CTE recursiva?
Perguntas Frequentes
A aula “CTEs RECURSIVE para hierarquias” é grátis?
Sim — o texto completo de “CTEs RECURSIVE para hierarquias” é 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 Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “CTEs RECURSIVE para hierarquias”?
Percorra dados hierárquicos (organogramas, comentários encadeados e travessia de grafos) com WITH RECURSIVE e condições de parada. Você pratica SQL Academy 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 Academy?
Nenhuma experiência prévia é necessária. SQL Academy 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 4 de 4.
Quanto tempo leva a aula “CTEs RECURSIVE para hierarquias”?
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 Academy?
Sim. Cada aula de SQL Academy 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
- Subconsultas escalares, de linha e de tabela
- Subconsultas correlacionadas e não correlacionadas
- Expressões de tabela comuns (WITH)
- CTEs RECURSIVE para hierarquias