SELF JOIN – Auto-jointure
Bonne lecture et bon apprentissage !
Junior TSAFACK – 08/08/2026
⏱️ Temps de lecture estimé : 5 minutes
En SQL, un SELF JOIN correspond à une jointure d’une table avec elle-même. Ce type de requête n’est pas si commun mais très pratique dans le cas où une table contient des informations qui font référence à d’autres enregistrements de la même table.
Bon à savoir : Un
SELF JOINn’est pas un mot-clé spécifique en SQL. C’est une technique qui consiste à utiliser n’importe quel type de jointure (INNER JOIN,LEFT JOIN, etc.) en faisant référence à la même table deux fois, avec des alias différents.
Syntaxe
Section titled “Syntaxe”Pour effectuer un SELF JOIN, la syntaxe de la requête SQL est la suivante :
SELECT t1.colonne1, t1.colonne2, t2.colonne1, t2.colonne2FROM table AS t1LEFT JOIN table AS t2 ON t2.fk_id = t1.id;Ici, la jointure est effectuée avec un LEFT JOIN, mais il est aussi possible de l’effectuer avec d’autres types de jointures (INNER JOIN, RIGHT JOIN, etc.) selon le besoin.
Remarque : L’utilisation d’alias (
AS t1,AS t2) est obligatoire dans unSELF JOINpour distinguer les deux instances de la même table.
Exemple concret : Hiérarchie des employés
Section titled “Exemple concret : Hiérarchie des employés”Un exemple potentiel pourrait être une application d’intranet d’entreprise qui possède une table des employés avec la hiérarchie entre eux. Les employés peuvent être dirigés par un supérieur direct qui se trouve lui-même dans la table.
Table « utilisateur » :
| id | prenom | nom | manager_id | |
|---|---|---|---|---|
| 1 | Sebastian | Martin | [email protected] | NULL |
| 2 | Gustave | Dubois | [email protected] | NULL |
| 3 | Georgette | Leroy | [email protected] | 1 |
| 4 | Gregory | Roux | [email protected] | 2 |
Dans cette table :
- Les employés 1 et 2 n’ont pas de supérieur (ils sont managers).
- L’employé 3 (Georgette) a pour manager l’employé 1 (Sebastian).
- L’employé 4 (Gregory) a pour manager l’employé 2 (Gustave).
Il est possible de lister sur une même ligne les employés avec leurs supérieurs directs, grâce à un SELF JOIN :
SELECT u1.id AS employe_id, u1.prenom AS employe_prenom, u1.nom AS employe_nom, u2.id AS manager_id, u2.prenom AS manager_prenom, u2.nom AS manager_nomFROM utilisateur u1LEFT JOIN utilisateur u2 ON u1.manager_id = u2.id;Résultat :
| employe_id | employe_prenom | employe_nom | manager_id | manager_prenom | manager_nom |
|---|---|---|---|---|---|
| 1 | Sebastian | Martin | NULL | NULL | NULL |
| 2 | Gustave | Dubois | NULL | NULL | NULL |
| 3 | Georgette | Leroy | 1 | Sebastian | Martin |
| 4 | Gregory | Roux | 2 | Gustave | Dubois |
Observations :
- Les managers (Sebastian et Gustave) apparaissent avec
NULLdans les colonnes de manager, car ils n’ont pas de supérieur. - Les employés (Georgette et Gregory) sont correctement associés à leur manager respectif.
Autres cas d’usage de SELF JOIN
Section titled “Autres cas d’usage de SELF JOIN”1. Relations de parenté (catégories, arborescences)
Section titled “1. Relations de parenté (catégories, arborescences)”Pour des tables avec des relations parent-enfant (ex: catégories de produits, commentaires imbriqués) :
Table « categorie » :
| id | nom | parent_id |
|---|---|---|
| 1 | Informatique | NULL |
| 2 | Matériel | 1 |
| 3 | Logiciel | 1 |
| 4 | Souris | 2 |
| 5 | Clavier | 2 |
Requête pour lister les sous-catégories avec leur parent :
SELECT c1.nom AS sous_categorie, c2.nom AS categorie_parentFROM categorie c1LEFT JOIN categorie c2 ON c1.parent_id = c2.id;2. Comparaison entre enregistrements
Section titled “2. Comparaison entre enregistrements”Pour comparer des lignes de la même table (ex: produits avec des prix similaires) :
SELECT p1.nom AS produit1, p2.nom AS produit2, p1.prixFROM produit p1INNER JOIN produit p2 ON p1.prix = p2.prix AND p1.id < p2.id;Remarque :
p1.id < p2.idpermet d’éviter les doublons et les autojointures (un produit avec lui-même).
3. Trouver les doublons
Section titled “3. Trouver les doublons”Pour trouver les enregistrements en double sur une colonne :
SELECT DISTINCT u1.emailFROM utilisateur u1INNER JOIN utilisateur u2 ON u1.email = u2.email AND u1.id <> u2.id;4. Chaînes de relations (recommandation, arbre généalogique)
Section titled “4. Chaînes de relations (recommandation, arbre généalogique)”Pour remonter une hiérarchie sur plusieurs niveaux, on peut enchaîner plusieurs SELF JOIN (ou utiliser des requêtes récursives avec CTE, mais c’est plus avancé).
Différence entre SELF JOIN et les autres jointures
Section titled “Différence entre SELF JOIN et les autres jointures”| Type de jointure | Description |
|---|---|
INNER JOIN classique |
Jointure entre deux tables différentes |
SELF JOIN |
Jointure d’une table avec elle-même, en utilisant des alias |
LEFT JOIN sur soi-même |
Permet de conserver les lignes sans correspondance (ex: managers sans supérieur) |
Bonnes pratiques
Section titled “Bonnes pratiques”-
Utilisez toujours des alias explicites pour distinguer les deux instances de la table (
t1,t2ouemploye,manager). -
Choisissez des alias parlants : dans l’exemple hiérarchique,
employeetmanagersont plus lisibles queaetb. -
Faites attention aux conditions de jointure : pour éviter les auto-jointures (un enregistrement avec lui-même), utilisez
AND u1.id <> u2.idsi nécessaire. -
Pour les hiérarchies profondes, privilégiez les requêtes récursives (CTE avec
WITH RECURSIVE) si votre SGBD le supporte. -
Testez avec des données représentatives : les
SELF JOINpeuvent rapidement devenir complexes.
Limites et alternatives
Section titled “Limites et alternatives”-
Pour les hiérarchies imbriquées (plus de 2 niveaux), un
SELF JOINmultiple peut devenir lourd. Utilisez des CTE récursives (PostgreSQL, SQL Server, Oracle, MySQL 8.0+, SQLite 3.8.3+) pour explorer des arborescences complètes. -
Si votre SGBD ne supporte pas les CTE récursives, vous pouvez utiliser des boucles en code applicatif ou des requêtes successives.
Prochain chapitre
Section titled “Prochain chapitre”Vous savez désormais comment joindre une table avec elle-même grâce au SELF JOIN. Mais que faire si vous souhaitez effectuer une jointure automatique basée sur les noms de colonnes identiques ?
👉 Chapitre 38 : NATURAL JOIN – Jointure naturelle
Bonne continuation !
Junior TSAFACK – 08/08/2026