Explicación de las autouniones
No entiendo la necesidad de autouniones. ¿Alguien puede explicármelos?
Un ejemplo sencillo sería de gran ayuda.
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.
Supongamos que tiene dos tablas:
Mesaemp1
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
Mesaemp2
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
Ahora, si deseas obtener el nombre de cada empleado con el nombre de su jefe:
select c1.Name , c2.Name As Boss
from emp1 c1
inner join emp2 c2 on c1.Boss_id = c2.Id
Lo que generará la siguiente tabla:
Name Boss
ABC XYZ
DEF ABC
XYZ DEF
Es bastante común cuando tienes una tabla que hace referencia a sí misma. Ejemplo: una tabla de empleados donde cada empleado puede 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
Una autounión es una unió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 contenga información de la persona (Nombre, Fecha de Nacimiento, Dirección...) y que incluya una columna donde se incluya el DNI 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.
Digamos que tienes una mesa users
, configurada así:
- ID de usuario
- nombre de usuario
- ID del administrador del usuario
En esta situación, si desea extraer tanto la información del usuario como 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