Explicación de autouniones

84

No entiendo la necesidad de autouniones. ¿Alguien puede explicarme por favor?

Un ejemplo sencillo sería muy útil.

Alex Gordon
fuente

Respuestas:

95

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

Suponga que tiene dos tablas:

Mesa emp1

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

Mesa 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á como resultado la siguiente tabla:

Name  Boss
ABC   XYZ
DEF   ABC
XYZ   DEF
política sin sentido
fuente
1
En este ejemplo, no puedo averiguar quién es el jefe. Aunque el exp es bueno y fácil de entender.
MAC
2
left joinCreo que sería mejor no dejar fuera al empleado (o jefe) que no tiene jefe; el mejor perro!
Rockin4Life33
22

Es bastante común cuando tienes una tabla que hace referencia a sí misma. Ejemplo: una tabla de empleados donde todos los empleados pueden tener un gerente y desea enumerar 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
Windyjonas
fuente
18

Una autocombinación es una combinación de una tabla 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 ...) y que incluye una columna donde se incluye el ID 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 una segunda unión, etc. e incluso los abuelos, etc.) en la misma consulta.

mjv
fuente
5

Digamos que tienes una mesa users, configurada así:

  • ID de usuario
  • nombre de usuario
  • ID del administrador del usuario

En esta situación, si se quería sacar tanto la información del usuario y la información del gerente en una consulta, es posible 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
ceejayoz
fuente
4

Son útiles si su tabla es autorreferencial. Por ejemplo, para una tabla de páginas, cada página puede tener un enlace nexty previous. Estos serían los ID de otras páginas de la misma tabla. Si en algún momento desea obtener un triple de páginas sucesivas, haría dos autouniones en las columnas nexty previouscon la misma idcolumna de la tabla .

Max Shawabkeh
fuente
4

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

Table (Employee): 

int id,
varchar name,
int manager_id

A continuación, puede utilizar la siguiente selección para encontrar a todos los empleados y sus gerentes:

select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id
Klaus Byskov Pedersen
fuente
4

Sin la capacidad de una tabla para hacer referencia a sí misma, tendríamos que crear tantas tablas para niveles de jerarquía como la cantidad de capas en la jerarquía. Pero dado que esa funcionalidad está disponible, usted une la tabla consigo misma y sql la trata como dos tablas separadas, por lo que todo se almacena correctamente en un solo lugar.

Eugenio
fuente
pero ahora (con suerte) comprende lo que sucedería si la autorreferencia no estuviera disponible.
Eugene
4

Aparte de las respuestas mencionadas anteriormente (que están muy bien explicadas), me gustaría agregar un ejemplo para que se pueda mostrar fácilmente el uso de Self Join. Suponga que tiene una tabla llamada CLIENTES que tiene los siguientes atributos: CustomerID, CustomerName, ContactName, City, Country. Ahora desea enumerar todos los que son de la "misma ciudad". Tendrás que pensar en una réplica de esta mesa para que podamos unirlos sobre la base de CITY. La consulta a continuación 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;
Mazhar MIK
fuente
3
+1 Esta respuesta es muy importante porque hay muchas preguntas SQL sobre SO a las que la respuesta es "use una autocomención", que las personas tienden a no ver cuando no tienen una auto referencia explícita (jerárquica).
JimmyB
1
Incluso aunque esto es copiar pasta de w3schools, creo que la respuesta anterior no explica la autounión sino la unión interna, que es diferente.
George K
3

Aquí hay muchas respuestas correctas, pero hay una variación que es igualmente correcta. Puede colocar sus condiciones de combinación en la declaración de combinación 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 que a veces desea e1.manager_id> e2.id

La ventaja de conocer ambos escenarios es que a veces tiene un montón de condiciones WHERE o JOIN y desea colocar sus condiciones de autounión en la otra cláusula para mantener su código legible.

Nadie abordó qué sucede cuando un empleado no tiene un gerente. ¿Eh? No se incluyen en el conjunto de resultados. ¿Qué sucede si desea incluir empleados que no tienen gerentes 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
BClaydon
fuente
1
Hm, en el cachorro, ¿por qué unes "mayor que" en lugar de "igual"?
Marcel
1
Hola. He visto que algunos ejemplos usan "FROM xxx, yyy WHERE" y algunos otros "FROM xxx JOIN yyy WHERE". ¿Podría explicar la diferencia, por favor?
skan
@Skan Esa es una muy buena pregunta. La respuesta corta es que es el antiguo método abreviado y quedará obsoleto. Lo usé en la escuela hace más de diez años y rara vez lo veo en la práctica. Aquí está la descripción más concisa que pude encontrar: bidn.com/blogs/KathiKellenberger/sql-server/2875/…
BClaydon
1

Un caso de uso es la verificación de 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
Moloso Spondee
fuente
Es mucho más rápido usar un GROUP BY y la cláusula a HAVING para encontrar duplicados. SELECCIONE nombre, correo electrónico, COUNT ( ) DE My_Bookings GRUPO POR nombre, fecha TENIENDO COUNT ( )> 1
George K
@GeorgeK True. Supongo que esto solo es necesario para una coincidencia aproximada (más allá de la agrupación por TRIM (LOWER (Name))) y no para una igualdad estricta.
Molossus Spondee
1

La autounión es útil cuando tiene que evaluar los datos de la tabla consigo misma. Lo que significa que correlacionará las filas de la misma tabla.

Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName

Por ejemplo, queremos encontrar los nombres de los empleados cuya designación inicial es igual a la designación actual. Podemos resolver esto usando self join de la siguiente manera.

SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
Sumanth Varada
fuente
0

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

Sin cortar
fuente
En realidad, dado que más de una fila puede hacer referencia a un "padre", también puede ser un árbol, como en el ejemplo frecuentemente citado de employee-> manager.
NVRAM
Solo estaba intentando una analogía simple, pero sí, un árbol también podría funcionar.
Unsliced
-4

Aquí está la explicación de la autounión en términos sencillos. La autounión no es un tipo diferente de combinación. Si ha entendido otros tipos de combinaciones (internas, externas y cruzadas), la autocompensación debería ser sencilla. En INNER, OUTER y CROSS JOINS, se une a 2 o más mesas diferentes. Sin embargo, en self join te unes a la misma mesa 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

usuario1472512
fuente