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.
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 |
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 |
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 |
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 |
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 |
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 |