learn khan how course books beginner academy sql self-join

sql - khan - Explicación de autouniones



sequel database (12)

No entiendo la necesidad de self-joins. ¿Puede alguien por favor explicarme?

Un simple ejemplo sería muy útil.


Además de las respuestas mencionadas anteriormente (que están muy bien explicadas), me gustaría agregar un ejemplo para que el uso de Self Join se pueda mostrar fácilmente. Supongamos que tiene una tabla llamada CUSTOMERS que tiene los siguientes atributos: CustomerID, CustomerName, ContactName, City, Country. Ahora desea hacer una lista de todos aquellos que son de la "misma ciudad". Deberá pensar en una réplica de esta tabla para que podamos unirnos en base a CITY. La siguiente consulta mostrará claramente lo que significa:

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City FROM Customers A, Customers B WHERE A.CustomerID <> B.CustomerID AND A.City = B.City ORDER BY A.City;


Aquí está la explicación de la auto unión en términos simples. La unión automática no es un tipo diferente de unión. Si ha entendido otros tipos de combinaciones (uniones internas, externas y cruzadas), entonces la unión automática debería ser directa. En INNER, OUTER y CROSS JOINS, se une a 2 o más tablas diferentes. Sin embargo, al unirse, te unes a la misma tabla con itslef. Aquí, no tenemos 2 tablas diferentes, pero tratamos la misma tabla como una tabla diferente usando alias de tabla. Si esto aún no está claro, recomendaría ver los siguientes videos de youtube.

Self Join con un ejemplo


Aquí hay muchas respuestas correctas, pero hay una variación que es igualmente correcta. Puede colocar sus condiciones de unión en la sentencia join en lugar de la cláusula WHERE.

SELECT e1.emp_id AS ''Emp_ID'' , e1.emp_name AS ''Emp_Name'' , e2.emp_id AS ''Manager_ID'' , e2.emp_name AS ''Manager_Name'' FROM Employee e1 RIGHT JOIN Employee e2 ON e1.emp_id = e2.emp_id

Tenga en cuenta a veces que quiere e1.manager_id> e2.id

La ventaja de conocer ambos escenarios es que a veces tienes un montón de condiciones WHERE o JOIN y quieres ubicar tus condiciones de auto unión en la otra cláusula para mantener tu código legible.

Nadie se refirió a lo que sucede cuando un empleado no tiene un gerente. ¿Huh? No están incluidos en el conjunto de resultados. ¿Qué sucede si desea incluir empleados que no tienen administradores pero no desea que se devuelvan combinaciones incorrectas?

Prueba este cachorro;

SELECT e1.emp_id AS ''Emp_ID'' , e1.emp_name AS ''Emp_Name'' , e2.emp_id AS ''Manager_ID'' , e2.emp_name AS ''Manager_Name'' FROM Employee e1 LEFT JOIN Employee e2 ON e1.emp_id = e2.emp_id AND e1.emp_name = e2.emp_name AND e1.every_other_matching_column = e2.every_other_matching_column


Es bastante común cuando tienes una tabla que hace referencia a sí misma. Ejemplo: una tabla de empleados en la que cada empleado puede tener un administrador, y usted desea hacer una lista de todos los empleados y el nombre de su gerente.

SELECT e.name, m.name FROM employees e LEFT OUTER JOIN employees m ON e.manager = m.id


Es el equivalente de la base de datos de una lista / árbol vinculado, donde una fila contiene una referencia de alguna capacidad a otra fila.


Imagine una tabla llamada Employee como se describe a continuación. Todos los empleados tienen un gerente que también es un empleado (tal vez a excepción del CEO, cuyo manager_id sería nulo)

Table (Employee): int id, varchar name, int manager_id

A continuación, puede usar la siguiente selección para buscar a todos los empleados y sus administradores:

select e1.name, e2.name as ManagerName from Employee e1, Employee e2 where where e1.manager_id = e2.id


Puede ver la autocombinación como dos tablas idénticas. Pero en la normalización, no puede crear dos copias de la tabla, por lo que simula tener dos tablas con autocombinación.

Supongamos que tiene dos tablas:

Tabla emp1

Id Name Boss_id 1 ABC 3 2 DEF 1 3 XYZ 2

Tabla emp2

Id Name Boss_id 1 ABC 3 2 DEF 1 3 XYZ 2

Ahora, si desea obtener el nombre de cada empleado con los nombres de su jefe:

select c1.Name , c2.Name As Boss from emp1 c1 inner join emp2 c2 on c1.Boss_id = c2.Id

Que dará salida a la siguiente tabla:

Name Boss ABC XYZ DEF ABC XYZ DEF


Sin la capacidad de una tabla para referenciarse a sí misma, tendríamos que crear tantas tablas para niveles jerárquicos como la cantidad de capas en la jerarquía. Pero como esa funcionalidad está disponible, se une a la tabla y sql la trata como dos tablas separadas, de modo que todo se almacena muy bien en un solo lugar.


Son útiles si su tabla es autorreferencial. Por ejemplo, para una tabla de páginas, cada página puede tener un enlace next y previous . Estos serían los identificadores de otras páginas en la misma tabla. Si en algún momento quieres obtener un triple de páginas sucesivas, harías dos autocombinaciones en las columnas next y previous con la misma columna de id la tabla.


Supongamos que tiene una tabla de users , configurada así:

  • identidad de usuario
  • nombre de usuario
  • identificación del administrador del usuario

En esta situación, si desea extraer la información del usuario y la información del administrador en una consulta, puede hacer esto:

SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id


Un caso de uso es verificar registros duplicados en una base de datos.

SELECT A.Id FROM My_Bookings A, My_Bookings B WHERE A.Name = B.Name AND A.Date = B.Date AND A.Id != B.Id


Una auto unión es una combinación de una mesa consigo misma.

Un caso de uso común es cuando la tabla almacena entidades (registros) que tienen una relación jerárquica entre ellos . Por ejemplo, una tabla que contiene información de la persona (nombre, fecha de nacimiento, dirección ...) e incluye una columna donde se incluye la identificación del padre (y / o de la madre). Luego, con una pequeña consulta como

SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber FROM myTableOfPersons As Child LEFT OUTER JOIN myTableOfPersons As Father ON Child.FatherId = Father.ID WHERE Child.City = ''Chicago'' -- Or some other condition or none

podemos obtener información sobre el niño y el padre (y la madre, con un segundo autoinscribirse, etc. e incluso los abuelos, etc.) en la misma consulta.