SELF JOIN para hierarquias
Una uma tabela a si mesma para modelar relações funcionário-gerente e pai-filho.
SELF JOIN para hierarquias é 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.
O que uma SELF JOIN realmente é
Uma SELF JOIN é simplesmente uma operação de junção em que uma tabela aparece nos dois lados. Não existe uma palavra-chave especial SELF JOIN; você escreve uma INNER ou LEFT JOIN normal e faz referência à mesma tabela duas vezes.
O recurso que faz isso funcionar são os apelidos de tabela. Você dá um apelido diferente a cada cópia para que o mecanismo as trate como duas tabelas independentes.
SELECT e.name, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;Por que os apelidos são obrigatórios
Sem apelidos distintos, a consulta fica ambígua: cada nome de coluna aparece duas vezes e o mecanismo não consegue determinar qual cópia você quer dizer. Atribuir um apelido a cada instância resolve isso.
Leia a junção como 'associe cada linha de funcionário à linha do funcionário que é seu gerente.' O apelido e representa o funcionário, m representa o gerente, e ambos vêm da mesma tabela física.
-- e = the employee, m = that employee's manager
SELECT e.id, e.name, m.name AS reports_to
FROM employees AS e
JOIN employees AS m ON e.manager_id = m.id;Modelo funcionário-gerente
O cenário clássico de SELF JOIN é uma lista de adjacência: uma única tabela armazena linhas, e cada linha aponta para seu elemento pai por meio de uma chave estrangeira para a mesma tabela.
Uma tabela employees com um manager_id que faz referência a employees.id modela um organograma inteiro em uma única tabela. Cada gerente é apenas outra linha de funcionário.
-- One table holds the whole hierarchy
-- employees(id, name, manager_id)
-- manager_id -> employees.idListando todos com seu gerente
A pergunta mais comum sobre SELF JOIN: mostre cada funcionário ao lado do nome de seu gerente. Faça a junção da cópia dos funcionários com a cópia dos gerentes usando e.manager_id = m.id.
Isso retorna uma linha por funcionário cujo gerente existe. Observe que o topo do organograma, o CEO, tem um NULL em manager_id e será excluído por uma junção interna.
SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;Usando LEFT JOIN para manter o topo da árvore
Para incluir o CEO (cujo manager_id é NULL), mude para uma LEFT JOIN. O lado dos funcionários é preservado; as colunas do gerente retornam NULL para as linhas sem pai.
Os entrevistadores usam isso para avaliar se você se lembra de que uma SELF JOIN interna elimina os nós raiz. A correção é a mesma que em qualquer situação de junção externa de 'manter linhas sem correspondência'.
SELECT e.name AS employee,
COALESCE(m.name, '(top level)') AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;Contando subordinados diretos por gerente
Uma pergunta comum de acompanhamento: quantas pessoas se reportam diretamente a cada gerente? Faça uma operação SELF JOIN e depois agrupe pelo gerente.
Fazemos a junção entre funcionários e gerentes, agrupamos pela identidade do gerente e contamos os funcionários. Isso conta apenas subordinados diretos, não toda a subárvore abaixo deles.
SELECT m.name AS manager, COUNT(*) AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;Avançando dois níveis
Para obter um funcionário, seu gerente e o gerente de seu gerente, encadeie três cópias da tabela. Cada nível exige outra operação SELF JOIN.
Isso funciona para uma profundidade fixa e conhecida. Se precisar de profundidade arbitrária, uma SELF JOIN não basta; esse é o sinal para usar uma CTE recursiva, que os entrevistadores esperam que você mencione.
SELECT e.name AS employee,
m.name AS manager,
g.name AS grand_manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
LEFT JOIN employees g ON m.manager_id = g.id;SELF JOIN versus CTE recursiva
Distinção principal que os entrevistadores avaliam:
- Uma SELF JOIN lida com um número fixo de níveis. Três cópias equivalem a três níveis, não mais.
- Uma CTE recursiva lida com profundidade ilimitada, fazendo repetidamente a junção da tabela consigo mesma até que nenhuma linha nova apareça.
Portanto, 'mostrar cada funcionário e seu gerente direto' exige uma SELF JOIN, mas 'listar todos os ancestrais ao longo da cadeia' exige recursão.
Categorias pai-filho
O mesmo padrão modela qualquer árvore: categorias de produtos, discussões em comentários e regiões geográficas. Uma tabela categories com parent_id referenciando seu próprio id tem estrutura idêntica à do caso funcionário-gerente.
Reconhecer que 'uma tabela com uma chave estrangeira que referencia a si mesma' equivale a 'SELF JOIN ou recursão' é o aprendizado reutilizável.
SELECT c.name AS category,
p.name AS parent_category
FROM categories c
LEFT JOIN categories p ON c.parent_id = p.id;Erros comuns em operações SELF JOIN
Fique atento a estes pontos em entrevistas:
- Esquecer os apelidos, causando erros de coluna ambígua.
- Usar
INNER JOINe eliminar silenciosamente linhas raiz (paiNULL). - Fazer a junção na direção errada:
e.id = m.manager_idem vez dee.manager_id = m.id.
Antes de escrever o ON, sempre declare em voz alta qual apelido é o filho e qual é o pai.
Quando usar SELF JOIN
Recorra a uma operação SELF JOIN sempre que uma tabela relacionar linhas a outras linhas da mesma tabela:
- Hierarquias com um nível fixo de consulta (funcionário para gerente).
- Combinação ou comparação de linhas de uma tabela (abordada na próxima lição).
Se a relação for recursiva e sem limite, mencione uma CTE recursiva como ferramenta mais adequada. Essa nuance diferencia iniciantes de profissionais de nível intermediário.
Verificação rápida
Teste sua compreensão de SELF JOINs em hierarquias.
Recapitulação: SELF JOIN para hierarquias
Principais conclusões:
- Uma operação SELF JOIN é uma junção normal com a mesma tabela nos dois lados, diferenciada por apelidos.
- Uma lista de adjacência (chave estrangeira que referencia a si mesma, como
manager_id) modela uma árvore em uma tabela. - Use
INNER JOINpara pares correspondentes;LEFT JOINpara manter linhas raiz com paisNULL. - As operações SELF JOIN lidam com uma profundidade fixa; a navegação sem limite exige uma CTE recursiva.
Perguntas Frequentes
A aula “SELF JOIN para hierarquias” é grátis?
Sim — o texto completo de “SELF JOIN 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.
O que vou aprender em “SELF JOIN para hierarquias”?
Una uma tabela a si mesma para modelar relações funcionário-gerente e pai-filho. 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 “SELF JOIN 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 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
- CROSS JOIN e produtos cartesianos
- SELF JOIN para hierarquias
- Comparando linhas dentro de uma tabela
- Escolhendo o tipo correto de junção