Maintenez SQLtest en vie : Aidez à couvrir les coûts du serveur de ce mois-ci de 100 $ pour garder toutes les leçons et le terrain de jeu SQL en ligne. Soutenez le projet →
Code SQL copié dans le presse-papiers

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.

SQL SELF JOIN : une table utilisée deux fois avec deux alias, les lignes de la première copie associées à celles de la seconde, et la condition a1.id < a2.id qui supprime les auto-correspondances et les paires miroirs

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 ».
ConditionAuto-correspondancesPaires miroirs
aucuneinclusesles deux
a1.id <> a2.idexcluesles deux
a1.id < a2.idexcluesune 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;
  • e est la copie qui joue le rôle des employés, m celle des managers.
  • LEFT JOIN conserve le manager au sommet, dont le manager_id est NULL ; avec INNER 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.id pour exclure les auto-correspondances et les paires miroirs en double.
  • Pour les hiérarchies, joignez manager_id à la clé de la même table ; utilisez LEFT JOIN pour 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.

Essayez de resoudre les exercices suivants pour consolider ce que vous avez appris dans cette lecon.

  1. Prénoms correspondant à d'autres noms