Contenido de esta guía
Qué significa
Un self join no es una cláusula nueva. Es un JOIN normal en el que una tabla se referencia dos veces. Los alias separan los dos papeles: una instancia puede representar al empleado y la otra a su responsable.
Qué problema resuelve
Algunas relaciones están dentro de una sola tabla. En empleados, la columna responsable_id guarda el identificador de otra fila de la misma tabla. Para mostrar el nombre del responsable, hay que volver a consultar empleados con un alias diferente.
Idea clave: piensa en dos copias lógicas de la misma tabla. Los datos no se duplican; los alias solo permiten dar un papel distinto a cada referencia.
Patrón básico
SELECT a.columna, b.columna
FROM tabla AS a
JOIN tabla AS b
ON a.clave_relacionada = b.clave;Ejemplo guiado
| id | nombre | responsable_id |
|---|---|---|
| 1 | Carmen Soler | NULL |
| 2 | Alex Ramos | 1 |
| 3 | Bea Molina | 2 |
| 4 | Carlos Peña | 1 |
| 5 | Diana León | 4 |
Queremos mostrar cada empleado junto al nombre de su responsable:
SELECT e.nombre AS empleado,
r.nombre AS responsable
FROM empleados AS e
LEFT JOIN empleados AS r
ON e.responsable_id = r.id
WHERE e.id IN (1, 2, 3, 5)
ORDER BY e.id;| empleado | responsable |
|---|---|
| Carmen Soler | NULL |
| Alex Ramos | Carmen Soler |
| Bea Molina | Alex Ramos |
| Diana León | Carlos Peña |
Cómo funciona
erepresenta a la persona cuya fila estamos mostrando.rrepresenta la posible fila de su responsable.- La condición compara
e.responsable_idconr.id. - Se usa
LEFT JOINpara conservar a Carmen, que no tiene responsable y produce NULL en esa columna.
Error frecuente
No distinguir las dos instancias
SELECT nombre, nombre
FROM empleados
JOIN empleados
ON responsable_id = id;Los nombres de tabla y columna quedan ambiguos. Asigna alias claros y cualifica cada columna: e.nombre, r.nombre, e.responsable_id y r.id.
Comprueba lo aprendido
Muestra empleado y responsable
Devuelve los empleados de los departamentos Ventas y Marketing junto con el nombre de su responsable. Conserva las columnas empleado, departamento y responsable, y ordena por el id del empleado.
Solución razonada
SELECT e.nombre AS empleado,
e.departamento,
r.nombre AS responsable
FROM empleados AS e
LEFT JOIN empleados AS r
ON e.responsable_id = r.id
WHERE e.departamento IN ('Ventas', 'Marketing')
ORDER BY e.id;Los alias hacen explícitos los dos papeles de la tabla. LEFT JOIN conserva cualquier empleado aunque no tenga responsable asignado.
Compatibilidad y matices
El patrón funciona en los motores SQL habituales porque utiliza alias y operaciones JOIN estándar. La relación puede ser jerárquica, como responsable y empleado, o comparativa, como encontrar pares de filas con una característica común. Al buscar parejas, añade una condición como a.id < b.id para no repetir cada par en ambos sentidos ni emparejar una fila consigo misma.
Qué debes recordar
- SELF JOIN es un patrón, no una palabra clave independiente.
- La misma tabla aparece con dos alias que representan papeles distintos.
- La condición ON debe indicar con precisión cómo se relacionan las filas.
Conceptos relacionados
Fuentes técnicas consultadas
Se utilizaron para comprobar el patrón y el uso de alias. La explicación y los ejemplos son originales.