Self Joins ou auto-junção são junções de uma tabela com ela mesma.

Visão geral

SELF JOIN vai funcionar exatamente como um INNER JOIN, porém, como o próprio nome diz, a junção é feita na mesma tabela, conforme ilustra a Figura 1.

Selecionando todos os dados que são comuns na mesma tabela
Figura 1. Selecionando todos os dados que são comuns na mesma tabela

Considere o seguinte cenário: temos a tabela alunos da Tabela 1 e desejamos listar os alunos que são da mesma turma que outro aluno na mesma tabela.

id nome turma
1 Cintia Pereira 1
2 Lucas Gabriel 2
3 Felipe Bruno 1
4 Thiago Barcelos 3
5 Bruno Reis 1
6 Osvaldo Sobrinho 4
7 Fabiano Francisco 4
Tabela 1. Tabela aluno
SELECT 
  A1.nome, 
  A2.nome 
FROM
  aluno A1
INNER JOIN 
  aluno A2
ON (A1.idaluno <> A2.idaluno) 
WHERE A1.idTurma = A2.idTurma
ORDER BY A1.nome

No trecho de código acima fizemos um INNER JOIN na mesma tabela onde o idaluno é diferente do outro idaluno. Em seguida definimos as condições da consulta pelo WHERE, onde somente virão resultados que tenham a turma igual, conforme mostra a Tabela 2.

nome nome
Bruno Reis Cintia Pereira
Bruno Reis Felipe Bruno
Cintia Pereira Felipe Bruno
Cintia Pereira Bruno Reis
Fabiano Francisco Osvaldo Sobrinho
Felipe Bruno Cintia Pereira
Felipe Bruno Bruno Reis
Osvaldo Sobrinho Fabiano Francisco
Tabela 2. Resultado da consulta informando qual aluno(A1) é da mesma sala que outro aluno (A2)

Observe que o aluno Thiago Barcelos (Tabela 1) não veio na consulta, pois não existe nenhum outro aluno na mesma turma que ele (turma de id 3).

Sintaxe

SELECT
  [ tabela1.coluna1, tabela2.coluna1, ... | N.coluna1, N.coluna2, … ]
FROM
  [ tabela1 A, tabela1 B ]
WHERE
  [ A.coluna1 = B.coluna1 ]

Na prática

Exemplo 1

Agora suponha que desejamos trazer todos os funcionários da tabela funcionario da Tabela 3 que tenha o mesmo salário que outro funcionário.

id nome Salario
1 Nicolas Silva 3500
2 Pedro Henrique 2500
3 Manuel Soares 3500
4 Lucas Bené 1350
Tabela 3. Tabela funcionario

Para esta consulta, temos o seguinte trecho de código abaixo:

SELECT 
  F1.nome,
  F2.nome,
  F1.salario
FROM 
  funcionario F1
INNER JOIN 
  funcionario F2
ON F1.id <> F2.id
WHERE F1.salario = F2.salario

Observe que fizemos um INNER JOIN na mesma tabela (SELF JOIN) e pedimos todos os funcionários que tenham o mesmo salário. Temos como resultado a Tabela 4.

id nome nome salario
1 Manuel Soares Nicolas Silva 3500
2 Nicolas Silva Manuel Soares 3500
Tabela 4. Resultado da busca de todos funcionários com mesmo salário

Exemplo 2

Para este exemplo, considere a tabela funcionario (Tabela 5), responsável por manter as informações sobre os funcionários da empresa.

id Nome id_supervisor
1 Pedro Henrique 6
2 Lucas da Silva 6
3 Luana Gabriela 7
4 Renato Lazuna 6
5 Rafaela Barrosa 7
6 Arline da Costa
7 Giseli Pascoa
8 Renan Pereira 6
Tabela 5. Estrutura da tabela funcionario

Suponhamos que seja necessário trazer em uma consulta, o nome dos funcionários e também o nome do seu respectivo supervisor. Para isso podemos utilizar a query abaixo:

SELECT 
  F1.Nome as SUPERVISOR,
    F2.nome as FUNCIONARIO
FROM 
  funcionario F1 
INNER JOIN 
  funcionario F2
ON F1.id = F2.id_supervisor
Order by 
  F1.id

O resultado da query acima pode ser visto abaixo, na (Tabela 6).

SUPERVISOR FUNCIONARIO
Arline da Costa Pedro Henrique
Arline da Costa Renan Pereira
Arline da Costa Renato Lazuna
Arline da Costa Lucas da Silva
Giseli Pascoa Luana Gabriela
Giseli Pascoa Rafaela Barrosa
Tabela 6. Resultado da busca dos Supervisores e seus respectivos funcionarios