CodeGym /Cursos /SQL SELF /Auto-unión de datos usando SELF JOIN

Auto-unión de datos usando SELF JOIN

SQL SELF
Nivel 12 , Lección 3
Disponible

SELF JOIN es una forma de unir una tabla consigo misma. Puede sonar raro al principio: ¿para qué unir una tabla consigo misma? Pero en la vida real, este tipo de tareas aparecen bastante seguido. Por ejemplo, imagina que tienes una tabla de empleados y cada empleado tiene un manager. El manager también es un empleado, así que sus datos están en la misma tabla. SELF JOIN nos ayuda a relacionar empleados con sus managers.

Formalmente hablando, SELF JOIN es un JOIN normal, pero usamos la misma tabla dos veces, dándole diferentes alias para distinguir sus "versiones".

Puedes usar SELF JOIN para:

  • Relaciones jerárquicas: establecer relaciones "padre-hijo", por ejemplo, empleado y su manager.
  • Análisis de datos dentro de la tabla: comparar registros en la tabla, por ejemplo, buscar productos o eventos similares.
  • Consultas complejas en estructuras con lógica duplicada.

Sintaxis de SELF JOIN

Para que quede más claro, vamos a ver la sintaxis simplificada de SELF JOIN:

SELECT
    A.column_name,
    B.column_name
FROM 
    table_name A
JOIN 
    table_name B
ON 
    A.common_column = B.common_column;

Aquí:

  • table_name A y table_name B son la misma tabla, pero con diferentes alias.
  • A.common_column y B.common_column son las columnas que se usan para unir los registros.

Los alias (A y B) son necesarios para que el SGBD "entienda" con cuál de las "copias" de la tabla estás trabajando.

Ejemplos de uso de SELF JOIN

Ejemplo 1: lista de empleados y sus managers

Entonces, supongamos que tenemos una tabla employees que se ve así:

employee_id name manager_id
1 Alex Lin NULL
2 Maria Chi 1
3 Otto Song 1
4 Nina Zhao 2

En esta tabla:

  • employee_id — identificador del empleado.
  • name — nombre del empleado.
  • manager_id — identificador del manager, que también es employee_id de otro empleado.

Objetivo: obtener una lista de empleados y sus managers.

Así se resuelve esta tarea usando 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

Aquí:

  • La tabla e es "empleados".
  • La tabla m también es "empleados", pero en el rol de "managers".

Alex Lin no tiene manager (manager_id = NULL), así que en el resultado el campo manager_name estará vacío.

Ejemplo 2: Buscar productos similares

Supón que tienes una tabla products:

product_id product_name category
1 Frigorífico Tecnika
2 Lavadora Tecnika
3 Smartfon Gadzhety
4 Planshet Gadzhety

Objetivo: encontrar pares de productos que pertenezcan a la misma categoría.

Solución usando 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
Frigorífico Lavadora
Smartfon Planshet

Fíjate en la condición p1.product_id < p2.product_id. Esto evita duplicar pares, por ejemplo, para que no aparezcan filas como Frigorífico — Lavadora y Lavadora — Frigorífico en los resultados.

Ejemplo 3: Análisis de jerarquías (padres e hijos)

Veamos otro ejemplo. Supón que tienes una tabla categories:

category_id category_name parent_id
1 Tecnika NULL
2 Gadzhety 1
3 Kompyutery 1
4 Smartfony 2

Aquí:

  • category_id — identificador de la categoría.
  • category_name — nombre de la categoría.
  • parent_id — identificador de la categoría padre.

Objetivo: relacionar categorías y sus categorías padre.

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
Tecnika NULL
Gadzhety Tecnika
Kompyutery Tecnika
Smartfony Gadzhety

Errores típicos al usar SELF JOIN

Olvidar poner alias: si no usas alias, es imposible distinguir una "copia" de la tabla de la otra.

Referencias cíclicas: si los datos tienen referencias cíclicas (por ejemplo, un empleado es su propio manager), esto puede dar resultados inesperados.

Duplicación de resultados: no olvides filtrar los resultados (por ejemplo, usando p1.product_id < p2.product_id) para evitar duplicados.

SELF JOIN es una herramienta potente para trabajar con datos, y usarla bien te permite resolver tareas complejas con jerarquías, relaciones dentro de tablas y análisis de datos. ¡Espero que ahora veas lo útil que es este "selfie" en el universo SQL!

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION