sql >> Base de Datos >  >> RDS >> Database

Unión automática de SQL

Este artículo proporciona una descripción general de la unión automática en SQL, así como un ejemplo básico.

¿Qué es una autounión?

El SELF JOIN de SQL está uniendo una tabla a sí mismo. Puede ser útil para consultar datos jerárquicos dentro de la misma tabla o para comparar filas dentro de la misma tabla.

Ejemplo 1:unión autoizquierda

Un ejemplo clásico de autocombinación está en una tabla de Empleados. En tal tabla, un empleado podría informar a otro empleado. Por lo tanto, podría usar una unión automática para unirse a la tabla en su columna de ID de empleado y columna de ID de gerente.

Supongamos que tenemos la siguiente tabla:

+--------------+-------------+------------+-------------+
| EmployeeId   | FirstName   | LastName   | ReportsTo   |
|--------------+-------------+------------+-------------|
| 1            | Homer       | Connery    | NULL        |
| 2            | Bart        | Pitt       | 1           |
| 3            | Maggie      | Griffin    | 1           |
| 4            | Peter       | Farnsworth | 2           |
| 5            | Marge       | Morrison   | NULL        |
| 6            | Lisa        | Batch      | 5           |
| 7            | Dave        | Zuckerberg | 6           |
| 8            | Vlad        | Cook       | 7           |
+--------------+-------------+------------+-------------+

Podemos hacer una combinación auto-izquierda en esta tabla para devolver a todos los empleados y sus gerentes.

SELECT
    CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
    CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
LEFT JOIN Employees e2 
ON e1.ReportsTo = e2.EmployeeId;

Resultado:

+------------------+-----------------+
| Employee         | Manager         |
|------------------+-----------------|
| Homer Connery    |                 |
| Bart Pitt        | Homer Connery   |
| Maggie Griffin   | Homer Connery   |
| Peter Farnsworth | Bart Pitt       |
| Marge Morrison   |                 |
| Lisa Batch       | Marge Morrison  |
| Dave Zuckerberg  | Lisa Batch      |
| Vlad Cook        | Dave Zuckerberg |
+------------------+-----------------+

Homer Connery y Marge Morrison no le reportan a nadie y por eso su Manager el campo está en blanco. En realidad, sería NULL si no hubiera realizado una concatenación de cadenas en las dos columnas.

Ejemplo 2:unión interna propia

Si no queríamos que se devolvieran los dos jefes principales, entonces podríamos hacer una unión interna en la mesa. Esto eliminará las filas que no coincidan en ambas tablas (es decir, aquellos empleados que no tengan un gerente correspondiente y viceversa).

SELECT
    CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
    CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
INNER JOIN Employees e2 
ON e1.ReportsTo = e2.EmployeeId;

Resultado:

+------------------+-----------------+
| Employee         | Manager         |
|------------------+-----------------|
| Bart Pitt        | Homer Connery   |
| Maggie Griffin   | Homer Connery   |
| Peter Farnsworth | Bart Pitt       |
| Lisa Batch       | Marge Morrison  |
| Dave Zuckerberg  | Lisa Batch      |
| Vlad Cook        | Dave Zuckerberg |
+------------------+-----------------+

Ejemplo 3:Unión por derecho propio

Si quisiéramos hacer una combinación automática, tendríamos que barajar algunas columnas en la consulta.

SELECT
    CONCAT(e1.FirstName, ' ', e1.LastName) AS Manager,
    CONCAT(e2.FirstName, ' ', e2.LastName) AS Employee
FROM Employees e1
RIGHT JOIN Employees e2
ON e1.EmployeeId = e2.ReportsTo;

Resultado:

+-----------------+------------------+
| Manager         | Employee         |
|-----------------+------------------|
|                 | Homer Connery    |
| Homer Connery   | Bart Pitt        |
| Homer Connery   | Maggie Griffin   |
| Bart Pitt       | Peter Farnsworth |
|                 | Marge Morrison   |
| Marge Morrison  | Lisa Batch       |
| Lisa Batch      | Dave Zuckerberg  |
| Dave Zuckerberg | Vlad Cook        |
+-----------------+------------------+