Database
 sql >> Base de Dados >  >> RDS >> Database

Auto-junção SQL


Este artigo fornece uma visão geral da autojunção no SQL, bem como um exemplo básico.

O que é uma associação automática?


O SQL SELF JOIN está unindo uma tabela a si mesma. Pode ser útil para consultar dados hierárquicos na mesma tabela ou para comparar linhas na mesma tabela.

Exemplo 1 - União Auto-esquerda


Um exemplo clássico de autojunção está em uma tabela Employees. Nessa tabela, um funcionário pode se reportar a outro funcionário. Portanto, você pode usar uma autojunção para unir a tabela em sua coluna de ID de funcionário e coluna de ID de gerente.

Suponha que temos a seguinte tabela:
+--------------+-------------+------------+-------------+
| 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 fazer uma junção à esquerda nesta tabela para retornar todos os funcionários e seus 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 e Marge Morrison não se reportam a ninguém e, portanto, seu Manager campo está em branco. Na verdade, seria NULL se eu não tivesse realizado uma concatenação de strings nas duas colunas.

Exemplo 2 – Self Inner Join


Se não quiséssemos que os dois chefes fossem devolvidos, poderíamos fazer uma junção interna na mesa. Isso eliminará todas as linhas que não têm correspondência em ambas as tabelas (ou seja, os funcionários que não têm um gerente correspondente e vice-versa).
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 |
+------------------+-----------------+

Exemplo 3 - Associação de Auto-Direito


Se quiséssemos fazer uma junção de auto-direita, precisaríamos embaralhar algumas colunas na 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        |
+-----------------+------------------+