SQL Auto unirse


Ejemplo

Una tabla se puede unir a sí misma, con diferentes filas que coinciden entre sí por alguna condición. En este caso de uso, se deben usar alias para distinguir las dos apariciones de la tabla.

En el ejemplo a continuación, para cada empleado en la tabla de empleados de la base de datos de ejemplo , se devuelve un registro que contiene el nombre del empleado junto con el nombre correspondiente del gerente del empleado. Como los gerentes también son empleados, la tabla se une consigo misma:

SELECT 
    e.FName AS "Employee", 
    m.FName AS "Manager"
FROM   
    Employees e
JOIN   
    Employees m 
    ON e.ManagerId = m.Id

Esta consulta devolverá los siguientes datos:

Empleado Gerente
Juan James
Miguel James
Johnathon Juan

Entonces, ¿cómo funciona esto?

La tabla original contiene estos registros:

Carné de identidad FName LName Número de teléfono ManagerId DepartmentId Salario Fecha de contratación
1 James Herrero 1234567890 NULO 1 1000 01-01-2002
2 Juan Johnson 2468101214 1 1 400 23-03-2005
3 Miguel Williams 1357911131 1 2 600 12-05-2009
4 Johnathon Herrero 1212121212 2 1 500 24-07-2016

La primera acción es crear un producto cartesiano de todos los registros en las tablas utilizadas en la cláusula FROM . En este caso, es la tabla Empleados dos veces, por lo que la tabla intermedia se verá así (eliminé todos los campos que no se usaron en este ejemplo):

e.Id e.FName e.ManagerId medio m.FName m.ManagerId
1 James NULO 1 James NULO
1 James NULO 2 Juan 1
1 James NULO 3 Miguel 1
1 James NULO 4 Johnathon 2
2 Juan 1 1 James NULO
2 Juan 1 2 Juan 1
2 Juan 1 3 Miguel 1
2 Juan 1 4 Johnathon 2
3 Miguel 1 1 James NULO
3 Miguel 1 2 Juan 1
3 Miguel 1 3 Miguel 1
3 Miguel 1 4 Johnathon 2
4 Johnathon 2 1 James NULO
4 Johnathon 2 2 Juan 1
4 Johnathon 2 3 Miguel 1
4 Johnathon 2 4 Johnathon 2

La siguiente acción es sólo para mantener los registros que cumplen los criterios de unión, por lo que todos los registros donde el alias e mesa ManagerId es igual al alias m tabla Id :

e.Id e.FName e.ManagerId medio m.FName m.ManagerId
2 Juan 1 1 James NULO
3 Miguel 1 1 James NULO
4 Johnathon 2 2 Juan 1

Luego, cada expresión utilizada en la cláusula SELECT se evalúa para devolver esta tabla:

e.FName m.FName
Juan James
Miguel James
Johnathon Juan

Finalmente, los nombres de columna e.FName y m.FName se reemplazan por sus nombres de columna de alias, asignados con el operador AS :

Empleado Gerente
Juan James
Miguel James
Johnathon Juan