🚀 Novembro começou! O SQLtest.online continua gratuito graças às doações de pessoas como você. Ajude-nos a atingir a meta deste mês mais cedo para que o site continue funcionando sem interrupções. Apoiar agora →
Código SQL copiado para a área de transferência

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.

SQL SELF JOIN: uma tabela usada duas vezes com dois alias, linhas da primeira cópia ligadas às da segunda, e a condição a1.id < a2.id que remove autocorrespondências e pares espelhados

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çãoAutocorrespondênciasPares espelhados
nenhumaincluídasambos
a1.id <> a2.idexcluídasambos
a1.id < a2.idexcluídasum

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, m o papel de gerentes.
  • O LEFT JOIN mantém o gerente do topo, cujo manager_id é NULL; com INNER JOIN essa 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.id para excluir autocorrespondências e pares espelhados duplicados.
  • Para hierarquias, junte manager_id à chave da mesma tabela; use LEFT JOIN para 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.

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. Encontre clientes cujo primeiro nome é o sobrenome de outro cliente
  2. Lista de Subdepartamentos (JOIN)
  3. Encontre funcionários altamente pagos
  4. Lista de subcategorias
  5. Encontrar uma lista de opções de voo