CodeGym /Cursos /SQL SELF /Auto-junção de dados com SELF JOIN

Auto-junção de dados com SELF JOIN

SQL SELF
Nível 12 , Lição 3
Disponível

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 A e table_name B são a mesma tabela, só que com apelidos diferentes.
  • A.common_column e B.common_column sã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 é o employee_id de 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!

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION