SQL Academy · Aula

Limitações das autojunções

Saiba quando usar recursão.

Aula 4 de 413 etapas

Limitações das autojunções é 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.

O que é uma junção autorreferente?

Uma junção autorreferente ocorre quando uma tabela é unida a si mesma. Ela é útil para comparar linhas dentro da mesma tabela, como ao encontrar funcionários e seus gerentes armazenados em uma única tabela employees.

Antes de explorarmos suas limitações, relembremos como uma junção autorreferente básica funciona na prática.

SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Um nível de profundidade

Uma junção autorreferente lida elegantemente com um salto em uma hierarquia. Se quiser emparelhar cada funcionário com seu gerente direto, uma única junção autorreferente é tudo de que precisa.

Isso funciona perfeitamente quando seus dados têm apenas um nível de profundidade ou quando você se importa apenas com relações diretas entre pai e filho.

SELECT child.name AS employee, parent.name AS direct_manager
FROM employees child
LEFT JOIN employees parent ON child.manager_id = parent.id;

Dois níveis: já está ficando complicado

E se precisar dos funcionários, de seus gerentes e dos gerentes de seus gerentes? Será necessário adicionar uma segunda junção autorreferente. A consulta cresce e fica mais difícil de ler.

Cada nível adicional da hierarquia exige mais um nome alternativo para a junção e mais uma cláusula JOIN.

SELECT e.name AS employee,
       m.name AS manager,
       gm.name AS grand_manager
FROM employees e
LEFT JOIN employees m  ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;

Três níveis: o padrão deixa de funcionar

Adicionar um terceiro nível exige mais uma junção. A essa altura, a consulta é prolixa, frágil e difícil de manter. Se a profundidade da hierarquia mudar, será necessário reescrever a consulta inteira.

Essa é a primeira grande limitação das junções autorreferentes: elas não se adaptam à profundidade.

SELECT e.name AS employee,
       m.name AS manager,
       gm.name AS grand_manager,
       ggm.name AS great_grand_manager
FROM employees e
LEFT JOIN employees m   ON e.manager_id = m.id
LEFT JOIN employees gm  ON m.manager_id = gm.id
LEFT JOIN employees ggm ON gm.manager_id = ggm.id;

Profundidade desconhecida: junções autorreferentes não ajudam

Em organogramas ou árvores de categorias do mundo real, a profundidade costuma ser desconhecida no momento da consulta. As junções autorreferentes exigem que você codifique diretamente o número de níveis. Se amanhã a hierarquia tiver 10 níveis de profundidade, sua consulta com uma junção autorreferente de 3 níveis deixará dados de fora silenciosamente.

Essa é uma limitação fundamental: as junções autorreferentes não conseguem percorrer um número arbitrário de níveis.

-- This only retrieves up to 3 levels deep.
-- Employees deeper than level 3 are simply missing from results.
SELECT e.name, m.name, gm.name
FROM employees e
LEFT JOIN employees m  ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;

Ciclos inviabilizam completamente as junções autorreferentes

Outra limitação séria: se os dados contiverem um ciclo (A gerencia B, B gerencia C, C gerencia A), uma consulta com junção autorreferente não entra em um laço infinito, mas também não detecta nem relata o ciclo corretamente.

Não é possível se proteger contra referências circulares usando apenas junções autorreferentes. As consultas recursivas têm mecanismos integrados de detecção de ciclos que faltam completamente às junções autorreferentes.

-- Cyclic data: row 3 points back to row 1
-- id | name    | manager_id
--  1 | Alice   | 3   <-- cycle!
--  2 | Bob     | 1
--  3 | Charlie | 2

-- A self join just shows one hop; it cannot detect the loop
SELECT e.name, m.name AS reports_to
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Introdução às CTEs recursivas

O SQL oferece uma solução específica para percorrer hierarquias de profundidade desconhecida: a expressão de tabela comum recursiva (CTE). Ela usa a sintaxe WITH RECURSIVE, compatível com PostgreSQL, MySQL 8+, SQLite e SQL Server.

Uma CTE recursiva tem duas partes: um membro âncora (as linhas iniciais) e um membro recursivo (a etapa que segue cada relação).

WITH RECURSIVE org_tree AS (
  -- Anchor: start with the top-level CEO (no manager)
  SELECT id, name, manager_id, 1 AS depth
  FROM employees
  WHERE manager_id IS NULL

  UNION ALL

  -- Recursive: find each employee whose manager is already in org_tree
  SELECT e.id, e.name, e.manager_id, ot.depth + 1
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT name, depth FROM org_tree ORDER BY depth;

Rastreando o caminho completo

Um recurso poderoso das CTEs recursivas é a possibilidade de acumular contexto à medida que você desce pela hierarquia. Por exemplo, é possível construir o caminho completo da raiz até cada nó — algo completamente impossível com uma junção autorreferente estática.

WITH RECURSIVE org_tree AS (
  SELECT id, name, manager_id,
         name AS path
  FROM employees
  WHERE manager_id IS NULL

  UNION ALL

  SELECT e.id, e.name, e.manager_id,
         ot.path || ' > ' || e.name
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT name, path FROM org_tree ORDER BY path;

Junção autorreferente versus CTE recursiva: quando escolher

Use uma junção autorreferente quando:

  • Precisar de exatamente um ou dois níveis de hierarquia.
  • A profundidade for fixa e conhecida antecipadamente.
  • Quiser simplicidade, sem o custo adicional de uma CTE.

Use uma CTE recursiva quando:

  • A profundidade for variável ou desconhecida.
  • Precisar do caminho completo de ancestrais ou descendentes.
  • Quiser detecção de ciclos por meio da cláusula CYCLE ou de proteções manuais.

Considerações de desempenho

Junções autorreferentes em colunas indexadas são extremamente rápidas para consultas de profundidade fixa. Cada junção é uma única busca, e o otimizador do banco de dados as processa bem.

As CTEs recursivas são mais flexíveis, mas podem ser dispendiosas em árvores profundas ou amplas. Sempre adicione uma proteção de profundidade no membro recursivo para evitar consultas descontroladas causadas por dados incorretos ou ciclos inesperados.

WITH RECURSIVE org_tree 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, ot.depth + 1
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
  WHERE ot.depth < 10   -- safety guard: stop at depth 10
)
SELECT name, depth FROM org_tree;

Casos de uso reais que exigem recursão

Muitos modelos de dados comuns exigem uma travessia de profundidade arbitrária que as junções autorreferentes simplesmente não conseguem realizar:

  • Árvores de categorias — categorias de produtos aninhadas em um catálogo de comércio eletrônico.
  • Lista de materiais — um produto composto por peças, cada uma composta por subpeças.
  • Tópicos de comentários — respostas a respostas a respostas.
  • Caminhos do sistema de arquivos — diretórios dentro de diretórios.

Em todos esses casos, opte por uma CTE recursiva em vez de empilhar junções autorreferentes.

WITH RECURSIVE category_tree AS (
  SELECT id, name, parent_id, name AS full_path
  FROM categories
  WHERE parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id,
         ct.full_path || ' / ' || c.name
  FROM categories c
  JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT id, name, full_path FROM category_tree ORDER BY full_path;

Verificação de conhecimentos

Verifique sua compreensão sobre as limitações das junções autorreferentes e quando usar CTEs recursivas em vez delas.

Recapitulação da lição

Nesta lição, aprendeu as limitações das junções autorreferentes para dados hierárquicos:

  • As junções autorreferentes funcionam bem para um ou dois níveis fixos de hierarquia.
  • Cada nível adicional exige um JOIN explícito, tornando as consultas frágeis e difíceis de manter.
  • As junções autorreferentes não conseguem lidar com profundidade desconhecida — as linhas além dos níveis codificados diretamente são excluídas silenciosamente.
  • Elas não oferecem proteção contra referências cíclicas nos dados.
  • Quando a profundidade for variável ou desconhecida, use uma CTE recursiva (WITH RECURSIVE).
  • Sempre adicione uma proteção de profundidade às consultas recursivas para evitar uma execução descontrolada.

Saber quando trocar uma junção autorreferente por uma CTE recursiva é uma habilidade essencial para consultar qualquer dado estruturado em árvore no SQL.

Grátis para começar

Aprenda SQL com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
46
Aulas
183

Perguntas Frequentes

A aula “Limitações das autojunções” é grátis?

Sim — o texto completo de “Limitações das autojunções” é 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 “Limitações das autojunções”?

Saiba quando usar recursão. 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 “Limitações das autojunções”?

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

  1. O que é uma autojunção
  2. Funcionários e gerentes
  3. Comparando linhas na mesma tabela
  4. Limitações das autojunções
← Voltar para SQL Academy