Database
 sql >> Base de données >  >> RDS >> Database

Auto-jointure SQL

Cet article fournit une vue d'ensemble de l'auto-jointure dans SQL, ainsi qu'un exemple de base.

Qu'est-ce qu'une auto-adhésion ?

Le SQL SELF JOIN joint une table à elle-même. Cela peut être utile pour interroger des données hiérarchiques dans le même tableau ou pour comparer des lignes dans le même tableau.

Exemple 1 – Jointure auto-gauche

Un exemple classique d'auto-jointure se trouve dans une table Employés. Dans un tel tableau, un employé pourrait rendre compte à un autre employé. Par conséquent, vous pouvez utiliser une auto-jointure pour joindre la table sur sa colonne d'ID d'employé et sa colonne d'ID de responsable.

Supposons que nous ayons le tableau suivant :

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

Nous pouvons effectuer une jointure gauche sur cette table pour renvoyer tous les employés et leurs responsables.

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;

Résultat :

+------------------+-----------------+
| 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 et Marge Morrison ne relèvent de personne et donc leur Manager champ est vide. En fait, ce serait NULL si je n'avais pas effectué une concaténation de chaînes sur les deux colonnes.

Exemple 2 – Jointure interne auto

Si nous ne voulions pas que les deux grands patrons soient renvoyés, nous pourrions faire une jointure interne sur la table. Cela éliminera toutes les lignes qui n'ont pas de correspondance dans les deux tables (c'est-à-dire les employés qui n'ont pas de responsable correspondant et 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;

Résultat :

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

Exemple 3 - Jointure auto-droite

Si nous voulions faire une jointure auto-droite, nous aurions besoin de mélanger quelques colonnes dans la requête.

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;

Résultat :

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