SQL SELF JOIN: Juntar uma Tabela Consigo Mesma
Lição 5.7 · Tempo de leitura: ~5 min · Tarefas para praticar ↓
Um self join em SQL junta uma tabela consigo mesma: a mesma tabela aparece duas vezes na consulta com dois alias diferentes. Nesta lição, você vai aprender por que os alias são obrigatórios, como encontrar pares de linhas que partilham um valor sem duplicados e como um self join lê uma hierarquia funcionário–gerente.
Às vezes, as linhas que você quer ligar estão na mesma tabela: um funcionário e o seu gerente, dois atores com o mesmo sobrenome, um voo e o voo de conexão. Não existe uma palavra-chave SELF JOIN. É um INNER JOIN ou LEFT JOIN comum em que os dois lados são a mesma tabela.
Os Alias São Obrigatórios
O banco de dados precisa saber de qual cópia da tabela vem cada coluna, então cada cópia precisa do seu próprio alias:
SELECT a1.column, a2.column
FROM some_table AS a1
INNER JOIN some_table AS a2 ON a1.some_column = a2.some_column;
Pense em a1 e a2 como duas tabelas separadas com o mesmo conteúdo.
Encontrar Pares de Linhas
Quais atores têm o mesmo sobrenome?
SELECT a1.first_name AS first_actor,
a2.first_name AS second_actor,
a1.last_name
FROM actor AS a1
INNER JOIN actor AS a2 ON a2.last_name = a1.last_name
AND a2.actor_id > a1.actor_id
ORDER BY a1.last_name, first_actor, second_actor;
Resultado: 108 pares de atores com o mesmo sobrenome, cada par uma única vez.
A condição a2.actor_id > a1.actor_id faz duas coisas:
- exclui que um ator corresponda a si mesmo, já que todo ator tem o mesmo sobrenome que ele próprio;
- mantém apenas um dos dois pares espelhados: com
<>você obteria tanto "CHRISTIAN–DEBBIE AKROYD" quanto "DEBBIE–CHRISTIAN AKROYD".
| Condição | Autocorrespondências | Pares espelhados |
|---|---|---|
| nenhuma | incluídas | ambos |
a1.id <> a2.id | excluídas | ambos |
a1.id < a2.id | excluídas | um |
Comparar Linhas
Um self join também pode comparar uma linha com outras linhas da mesma tabela. Filmes mais longos do que "ACADEMY DINOSAUR" e com a mesma classificação:
SELECT f2.title, f2.rating, f2.length
FROM film AS f1
INNER JOIN film AS f2 ON f2.rating = f1.rating
AND f2.length > f1.length
WHERE f1.title = 'ACADEMY DINOSAUR'
ORDER BY f2.length DESC
LIMIT 10;
Resultado: os 10 filmes PG mais longos que duram mais do que "ACADEMY DINOSAUR" (86 minutos).
Hierarquias: Funcionários e Gerentes
O self join clássico é uma hierarquia guardada numa só tabela: cada linha de funcionário tem um manager_id que aponta para outra linha da mesma tabela. O Sakila não tem uma tabela assim, então este é o padrão:
SELECT e.name AS employee,
m.name AS manager
FROM employee AS e
LEFT JOIN employee AS m ON m.employee_id = e.manager_id;
eé a cópia que faz o papel de funcionários,mo papel de gerentes.- O
LEFT JOINmantém o gerente do topo, cujomanager_idéNULL; comINNER JOINessa linha desapareceria.
Um self join sobe um nível. Para percorrer toda a hierarquia em qualquer profundidade, você vai usar CTEs recursivas na Lição 6.5.
Principais conclusões:
- Um self join é uma junção normal em que os dois lados são a mesma tabela.
- Cada cópia da tabela precisa do seu próprio alias.
- Use
a1.id < a2.idpara excluir autocorrespondências e pares espelhados duplicados. - Para hierarquias, junte
manager_idà chave da mesma tabela; useLEFT JOINpara manter o nível superior.
Perguntas Frequentes
O que é um self join em SQL?
Uma junção de uma tabela consigo mesma. A tabela aparece duas vezes com alias diferentes, e a condição de junção liga as linhas de uma cópia às linhas da outra, por exemplo um funcionário ao seu gerente.
Como evitar pares duplicados num self join?
Compare as chaves com < em vez de <>: a1.id < a2.id. Isso exclui que uma linha corresponda a si mesma e mantém apenas um dos dois pares espelhados.
SELF JOIN é uma palavra-chave SQL separada?
Não. Um self join é escrito com INNER JOIN ou LEFT JOIN; a única diferença é que as duas tabelas da junção são a mesma.