Leçon 5.7 · Temps de lecture : ~5 min
Un self join SQL joint une table à elle-même : la même table apparaît deux fois dans la requête sous deux alias différents. Dans cette leçon, vous apprendrez pourquoi les alias sont obligatoires, comment trouver sans doublons des paires de lignes qui partagent une valeur, et comment un self join lit une hiérarchie employé–manager.
SQL SELF JOIN : joindre une table à elle-même
Parfois, les lignes à relier se trouvent dans la même table : un employé et son manager, deux acteurs portant le même nom, un vol et sa correspondance. Il n'existe pas de mot-clé SELF JOIN. C'est un INNER JOIN ou un LEFT JOIN ordinaire dont les deux côtés sont la même table.
Les alias sont obligatoires
La base de données doit savoir de quelle copie de la table provient chaque colonne, donc chaque copie a besoin de son propre alias :
SELECT a1.column, a2.column
FROM some_table AS a1
INNER JOIN some_table AS a2 ON a1.some_column = a2.some_column;
Considérez a1 et a2 comme deux tables distinctes au contenu identique.
Trouver des paires de lignes
Quels acteurs partagent un nom de famille ?
SELECT a1.first_name AS first_actor,
a2.first_name AS second_actor,
a1.last_name
FROM actor AS a1
INNER JOIN actor AS a2 ON a2.last_name = a1.last_name
AND a2.actor_id > a1.actor_id
ORDER BY a1.last_name, first_actor, second_actor;
Résultat : 108 paires d'acteurs portant le même nom de famille, chaque paire une seule fois.
La condition a2.actor_id > a1.actor_id remplit deux rôles :
- elle exclut l'association d'un acteur avec lui-même, puisque chaque acteur a le même nom que lui-même ;
- elle ne garde qu'une des deux paires miroirs : avec
<>, vous obtiendriez à la fois « CHRISTIAN–DEBBIE AKROYD » et « DEBBIE–CHRISTIAN AKROYD ».
| Condition | Auto-correspondances | Paires miroirs |
|---|---|---|
| aucune | incluses | les deux |
a1.id <> a2.id | exclues | les deux |
a1.id < a2.id | exclues | une seule |
Comparer des lignes
Un self join peut aussi comparer une ligne avec d'autres lignes de la même table. Les films plus longs que « ACADEMY DINOSAUR » et de même classification :
SELECT f2.title, f2.rating, f2.length
FROM film AS f1
INNER JOIN film AS f2 ON f2.rating = f1.rating
AND f2.length > f1.length
WHERE f1.title = 'ACADEMY DINOSAUR'
ORDER BY f2.length DESC
LIMIT 10;
Résultat : les 10 films PG les plus longs qui durent plus que « ACADEMY DINOSAUR » (86 minutes).
Hiérarchies : employés et managers
Le self join classique est une hiérarchie stockée dans une seule table : chaque ligne d'employé a un manager_id qui pointe vers une autre ligne de la même table. Sakila n'a pas de telle table, voici donc le modèle :
SELECT e.name AS employee,
m.name AS manager
FROM employee AS e
LEFT JOIN employee AS m ON m.employee_id = e.manager_id;
eest la copie qui joue le rôle des employés,mcelle des managers.LEFT JOINconserve le manager au sommet, dont lemanager_idestNULL; avecINNER JOIN, cette ligne disparaîtrait.
Un self join remonte d'un niveau. Pour parcourir toute la hiérarchie à n'importe quelle profondeur, vous utiliserez des CTE récursives dans la leçon 6.5.
Points clés :
- Un self join est une jointure normale dont les deux côtés sont la même table.
- Chaque copie de la table a besoin de son propre alias.
- Utilisez
a1.id < a2.idpour exclure les auto-correspondances et les paires miroirs en double. - Pour les hiérarchies, joignez
manager_idà la clé de la même table ; utilisezLEFT JOINpour garder le niveau supérieur.
Questions fréquentes
Qu'est-ce qu'un self join en SQL ?
Une jointure d'une table avec elle-même. La table est listée deux fois avec des alias différents, et la condition de jointure relie les lignes d'une copie à celles de l'autre, par exemple un employé à son manager.
Comment éviter les paires en double dans un self join ?
Comparez les clés avec < au lieu de <> : a1.id < a2.id. Cela exclut l'association d'une ligne avec elle-même et ne garde qu'une des deux paires miroirs.
SELF JOIN est-il un mot-clé SQL à part ?
Non. On écrit un self join avec INNER JOIN ou LEFT JOIN ; la seule différence est que les deux tables de la jointure sont la même.