SELF JOIN é um jeito de juntar uma tabela com ela mesma. Pode parecer estranho de primeira: por que juntar uma tabela com ela mesma? Mas na vida real isso aparece direto. Por exemplo, imagina que você tem uma tabela de funcionários, e cada funcionário tem um gerente. O gerente também é um funcionário, então os dados dele estão na mesma tabela. O SELF JOIN ajuda a ligar funcionários com seus gerentes.
Falando formalmente, SELF JOIN é só um JOIN normal, mas você usa a mesma tabela duas vezes, dando apelidos (ou aliases) diferentes pra distinguir as "versões" dela.
Você pode usar SELF JOIN pra:
- Relações hierárquicas: tipo relação "pai-filho", por exemplo, funcionário e seu gerente.
- Análise de dados dentro da tabela: comparar registros na tabela, tipo procurar produtos ou eventos parecidos.
- Consultas mais complexas em estruturas com lógica duplicada.
Sintaxe do SELF JOIN
Pra ficar mais claro, bora ver logo a sintaxe simplificada do SELF JOIN:
SELECT
A.column_name,
B.column_name
FROM
table_name A
JOIN
table_name B
ON
A.common_column = B.common_column;
Aqui:
table_name Aetable_name Bsão a mesma tabela, só que com apelidos diferentes.A.common_columneB.common_columnsão as colunas usadas pra juntar os registros.
Os apelidos (A e B) servem pra que o SGBD "saque" com qual "cópia" da tabela você tá mexendo.
Exemplos de uso do SELF JOIN
Exemplo 1: lista de funcionários e seus gerentes
Então, imagina que a gente tem uma tabela employees que é assim:
| employee_id | name | manager_id |
|---|---|---|
| 1 | Alex Lin | NULL |
| 2 | Maria Chi | 1 |
| 3 | Otto Song | 1 |
| 4 | Nina Zhao | 2 |
Nessa tabela:
employee_id— identificador do funcionário.name— nome do funcionário.manager_id— identificador do gerente, que também é oemployee_idde outro funcionário.
Missão: pegar a lista de funcionários e seus gerentes.
Olha como dá pra resolver isso com SELF JOIN:
SELECT
e.name AS employee_name,
m.name AS manager_name
FROM
employees e
LEFT JOIN
employees m
ON
e.manager_id = m.employee_id;
Resultado:
| employee_name | manager_name |
|---|---|
| Alex Lin | NULL |
| Maria Chi | Alex Lin |
| Otto Song | Alex Lin |
| Nina Zhao | Maria Chi |
Aqui:
- Tabela
e— são os "funcionários". - Tabela
m— também são "funcionários", mas no papel de "gerentes".
O Alex Lin não tem gerente manager_id = NULL, então no resultado o campo manager_name fica vazio.
Exemplo 2: Procurando produtos parecidos
Imagina que a gente tem uma tabela products:
| product_id | product_name | category |
|---|---|---|
| 1 | Geladeira | Tecnologia |
| 2 | Máquina de lavar | Tecnologia |
| 3 | Smartphone | Gadgets |
| 4 | Tablet | Gadgets |
Missão: achar pares de produtos que são da mesma categoria.
Resolvendo com SELF JOIN:
SELECT
p1.product_name AS product_1,
p2.product_name AS product_2
FROM
products p1
JOIN
products p2
ON
p1.category = p2.category
AND
p1.product_id < p2.product_id;
Resultado:
| product_1 | product_2 |
|---|---|
| Geladeira | Máquina de lavar |
| Smartphone | Tablet |
Repara na condição p1.product_id < p2.product_id. Isso evita que apareçam pares duplicados, tipo pra não ter Geladeira — Máquina de lavar e Máquina de lavar — Geladeira ao mesmo tempo no resultado.
Exemplo 3: Analisando hierarquias (pais e filhos)
Mais um exemplo. Imagina que a gente tem uma tabela categories:
| category_id | category_name | parent_id |
|---|---|---|
| 1 | Tecnologia | NULL |
| 2 | Gadgets | 1 |
| 3 | Computadores | 1 |
| 4 | Smartphones | 2 |
Aqui:
category_id— identificador da categoria.category_name— nome da categoria.parent_id— identificador da categoria pai.
Missão: ligar categorias com suas categorias-pai.
Consulta:
SELECT
c1.category_name AS child_category,
c2.category_name AS parent_category
FROM
categories c1
LEFT JOIN
categories c2
ON
c1.parent_id = c2.category_id;
Resultado:
| child_category | parent_category |
|---|---|
| Tecnologia | NULL |
| Gadgets | Tecnologia |
| Computadores | Tecnologia |
| Smartphones | Gadgets |
Erros comuns usando SELF JOIN
Esqueceu de colocar aliases (apelidos): se não usar aliases, não dá pra saber qual "cópia" da tabela é qual.
Referências cíclicas: se os dados têm referências cíclicas (tipo funcionário é gerente de si mesmo), pode dar resultado estranho.
Duplicação de resultados: não esquece de filtrar os resultados (tipo usando p1.product_id < p2.product_id) pra não duplicar.
SELF JOIN é uma ferramenta poderosa pra trabalhar com dados, e usar ela direito te ajuda a resolver problemas cabulosos com hierarquias, relações dentro da tabela e análise de dados. Espero que agora você veja como esse "selfie" é útil no universo SQL!
GO TO FULL VERSION