SELF JOIN — c'est une façon de joindre une table avec elle-même. Ça peut paraître bizarre au début : pourquoi joindre une table avec elle-même ? Mais dans la vraie vie, ce genre de truc arrive assez souvent. Par exemple, imagine que t'as une table d'employés, et chaque employé a un manager. Le manager est aussi un employé, donc ses infos sont dans la même table. SELF JOIN va nous aider à relier les employés à leurs managers.
Si on parle formellement, SELF JOIN — c'est juste un JOIN classique, mais on utilise la même table deux fois, en lui donnant des alias différents pour distinguer ses "versions".
Tu peux utiliser SELF JOIN pour :
- Les relations hiérarchiques : établir des liens "parent-enfant", genre employé et son manager.
- L'analyse de données dans la même table : comparer des lignes, par exemple pour trouver des produits ou des événements similaires.
- Des requêtes complexes sur des structures avec de la logique dupliquée.
Syntaxe de SELF JOIN
Pour que ce soit plus clair, regarde direct la syntaxe simplifiée de SELF JOIN :
SELECT
A.column_name,
B.column_name
FROM
table_name A
JOIN
table_name B
ON
A.common_column = B.common_column;
Ici :
table_name Aettable_name B— c'est la même table, mais avec des alias différents.A.common_columnetB.common_column— les colonnes qu'on utilise pour joindre les lignes.
Les alias (A et B) servent à ce que le SGBD "comprenne" avec quelle "copie" de la table tu bosses.
Exemples d'utilisation de SELF JOIN
Exemple 1 : liste des employés et leurs managers
Alors, imaginons qu'on a une table employees qui ressemble à ça :
| employee_id | name | manager_id |
|---|---|---|
| 1 | Alex Lin | NULL |
| 2 | Maria Chi | 1 |
| 3 | Otto Song | 1 |
| 4 | Nina Zhao | 2 |
Dans cette table :
employee_id— identifiant de l'employé.name— nom de l'employé.manager_id— identifiant du manager, qui est aussi leemployee_idd'un autre employé.
Objectif : obtenir la liste des employés et de leurs managers.
Voilà comment on fait ça avec SELF JOIN :
SELECT
e.name AS employee_name,
m.name AS manager_name
FROM
employees e
LEFT JOIN
employees m
ON
e.manager_id = m.employee_id;
Résultat :
| employee_name | manager_name |
|---|---|
| Alex Lin | NULL |
| Maria Chi | Alex Lin |
| Otto Song | Alex Lin |
| Nina Zhao | Maria Chi |
Ici :
- La table
e— c'est les "employés". - La table
m— c'est aussi les "employés", mais dans le rôle de "managers".
Alex Lin n'a pas de manager (manager_id = NULL), donc dans le résultat le champ manager_name est vide.
Exemple 2 : Trouver des produits similaires
Imaginons qu'on a une table products :
| product_id | product_name | category |
|---|---|---|
| 1 | Réfrigérateur | Technika |
| 2 | Machine à laver | Technika |
| 3 | Smartphone | Gadzhety |
| 4 | Tablette | Gadzhety |
Objectif : trouver les paires de produits qui sont dans la même catégorie.
Solution avec SELF JOIN :
SELECT
p1.product_name AS product_1,
p2.product_name AS product_2
FROM
products p1
JOIN
products p2
ON
p1.category = p2.category
AND
p1.product_id < p2.product_id;
Résultat :
| product_1 | product_2 |
|---|---|
| Réfrigérateur | Machine à laver |
| Smartphone | Tablette |
Fais gaffe à la condition p1.product_id < p2.product_id. Ça évite de dupliquer les paires, genre pour pas avoir à la fois Réfrigérateur — Machine à laver et Machine à laver — Réfrigérateur dans les résultats.
Exemple 3 : Analyse des hiérarchies (parents et enfants)
Encore un exemple. Imaginons qu'on a une table categories :
| category_id | category_name | parent_id |
|---|---|---|
| 1 | Technika | NULL |
| 2 | Gadzhety | 1 |
| 3 | Kompyutery | 1 |
| 4 | Smartfony | 2 |
Ici :
category_id— identifiant de la catégorie.category_name— nom de la catégorie.parent_id— identifiant de la catégorie parente.
Objectif : relier les catégories à leurs catégories parentes.
Requête :
SELECT
c1.category_name AS child_category,
c2.category_name AS parent_category
FROM
categories c1
LEFT JOIN
categories c2
ON
c1.parent_id = c2.category_id;
Résultat :
| child_category | parent_category |
|---|---|
| Technika | NULL |
| Gadzhety | Technika |
| Kompyutery | Technika |
| Smartfony | Gadzhety |
Erreurs classiques avec SELF JOIN
Oubli des alias : si tu utilises pas d'alias, c'est impossible de distinguer une "copie" de la table de l'autre.
Références cycliques : si les données ont des références cycliques (genre un employé est son propre manager), ça peut donner des résultats chelous.
Duplication des résultats : pense à filtrer les résultats (par exemple avec p1.product_id < p2.product_id) pour éviter les doublons.
SELF JOIN — c'est un outil puissant pour bosser avec les données, et bien l'utiliser permet de gérer des trucs complexes avec des hiérarchies, des liens dans les tables et de l'analyse de données. J'espère que maintenant tu vois à quel point ce "selfie" est utile dans l'univers SQL !
GO TO FULL VERSION