SQL Self Join


Exemple

Une table peut être jointe à elle-même, avec différentes lignes correspondant à une condition. Dans ce cas d'utilisation, des alias doivent être utilisés pour distinguer les deux occurrences de la table.

Dans l'exemple ci-dessous, pour chaque employé dans la table Employees de la base de données exemple , un enregistrement contenant le prénom de l'employé et le prénom correspondant du responsable de l'employé est renvoyé. Les managers étant également des employés, la table est jointe à elle-même:

SELECT 
    e.FName AS "Employee", 
    m.FName AS "Manager"
FROM   
    Employees e
JOIN   
    Employees m 
    ON e.ManagerId = m.Id

Cette requête renvoie les données suivantes:

Employé Directeur
John James
Michael James
Johnathon John

Alors, comment ça marche?

La table d'origine contient ces enregistrements:

Id FName LName Numéro de téléphone ManagerId DépartementId Un salaire Date d'embauche
1 James Forgeron 1234567890 NUL 1 1000 01-01-2002
2 John Johnson 2468101214 1 1 400 23-03-2005
3 Michael Williams 1357911131 1 2 600 12-05-2009
4 Johnathon Forgeron 1212121212 2 1 500 24-07-2016

La première action consiste à créer un produit cartésien de tous les enregistrements des tables utilisées dans la clause FROM . Dans ce cas, c'est la table Employees à deux reprises, de sorte que la table intermédiaire ressemblera à ceci (j'ai supprimé tous les champs non utilisés dans cet exemple):

e.Id e.FName e.ManagerId milieu m.FName mManagerId
1 James NUL 1 James NUL
1 James NUL 2 John 1
1 James NUL 3 Michael 1
1 James NUL 4 Johnathon 2
2 John 1 1 James NUL
2 John 1 2 John 1
2 John 1 3 Michael 1
2 John 1 4 Johnathon 2
3 Michael 1 1 James NUL
3 Michael 1 2 John 1
3 Michael 1 3 Michael 1
3 Michael 1 4 Johnathon 2
4 Johnathon 2 1 James NUL
4 Johnathon 2 2 John 1
4 Johnathon 2 3 Michael 1
4 Johnathon 2 4 Johnathon 2

L'action suivante consiste à ne conserver que les enregistrements répondant aux critères JOIN , de sorte que tous les enregistrements pour lesquels la table e ManagerId est égale à l' Id table m ManagerId l'alias:

e.Id e.FName e.ManagerId milieu m.FName mManagerId
2 John 1 1 James NUL
3 Michael 1 1 James NUL
4 Johnathon 2 2 John 1

Ensuite, chaque expression utilisée dans la clause SELECT est évaluée pour renvoyer cette table:

e.FName m.FName
John James
Michael James
Johnathon John

Enfin, les noms de colonne e.FName et m.FName sont remplacés par leurs noms de colonne d'alias, attribués à l'opérateur AS :

Employé Directeur
John James
Michael James
Johnathon John