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 Aytable_name Bson la misma tabla, pero con diferentes alias.A.common_columnyB.common_columnson 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 esemployee_idde 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
ees "empleados". - La tabla
mtambié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!
GO TO FULL VERSION