Database
 sql >> Database >  >> RDS >> Database

SQL Self Join

Questo articolo fornisce una panoramica del self join in SQL, oltre a un esempio di base.

Cos'è un Self Join?

L'SQL SELF JOIN sta unendo un tavolo a se stesso. Può essere utile per eseguire query sui dati gerarchici all'interno della stessa tabella o per confrontare le righe all'interno della stessa tabella.

Esempio 1 – Partecipazione a sinistra automatica

Un classico esempio di self join è in una tabella Employees. In tale tabella, un dipendente potrebbe riferire a un altro dipendente. Pertanto, puoi utilizzare un self join per unirti alla tabella nella colonna ID dipendente e nella colonna ID manager.

Supponiamo di avere la seguente tabella:

+--------------+-------------+------------+-------------+
| 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           |
+--------------+-------------+------------+-------------+

Possiamo fare un'iscrizione a sinistra su questo tavolo per restituire tutti i dipendenti e i loro manager.

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;

Risultato:

+------------------+-----------------+
| 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 non riferiscono a nessuno e quindi il loro Manager il campo è vuoto. In realtà, sarebbe NULL se non avessi eseguito una concatenazione di stringhe sulle due colonne.

Esempio 2:unione interiore di sé

Se non volessimo che i due head honchos venissero restituiti, allora potremmo fare un inner join sul tavolo. Ciò eliminerà tutte le righe che non hanno una corrispondenza in entrambe le tabelle (ovvero quei dipendenti che non hanno un manager corrispondente e 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;

Risultato:

+------------------+-----------------+
| 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 |
+------------------+-----------------+

Esempio 3 – Partecipazione con diritto personale

Se volessimo eseguire un'unione automatica, avremmo bisogno di mescolare alcune colonne nella query.

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;

Risultato:

+-----------------+------------------+
| 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        |
+-----------------+------------------+