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 lie des informations avec des enregistrements de la même table.
Syntaxe
Pour effectuer un SELF JOIN, la syntaxe de la requête SQL est la suivante:
SELECT `t1`.`nom_colonne1`, `t1`.`nom_colonne2`, `t2`.`nom_colonne1`, `t2`.`nom_colonne2` FROM `table` as `t1` LEFT OUTER 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.
Exemple
Un exemple potentiel pourrait être une application d’un intranet d’entreprise qui possède la table des employés avec la hiérarchie entre eux. Les employés peuvent être dirigé par un supérieur direct qui se trouve lui-même dans la table.
Table utilisateur :
id | prenom | nom | manager_id | |
---|---|---|---|---|
1 | Sebastien | Martin | s.martin@example.com | NULL |
2 | Gustave | Dubois | g.dubois@example.com | NULL |
3 | Georgette | Leroy | g.leroy@example.com | 1 |
4 | Gregory | Roux | g.roux@example.com | 2 |
Les enregistrements de la table ci-dessus montre bien des employés. Les premiers employés n’ont pas de supérieur, tandis que les employés n°3 et n°4 ont respectivement pour supérieur l’employé n°1 et l’employé n°2.
Il est possible de lister sur une même ligne les employés avec leurs supérieurs direct, grâce à une requête telle que celle-ci:
SELECT `u1`.`u_id`, `u1`.`u_nom`, `u2`.`u_id`, `u2`.`u_nom` FROM `utilisateur` as `u1` LEFT OUTER JOIN `utilisateur` as `u2` ON `u2`.`u_manager_id` = `u1`.`u_id`
Résultat :
u1_id | u1_prenom | u1_nom | u1_email | u1_manager_id | u2_prenom | u2_nom |
---|---|---|---|---|---|---|
1 | Sebastien | Martin | s.martin@example.com | NULL | NULL | NULL |
2 | Gustave | Dubois | g.dubois@example.com | NULL | NULL | NULL |
3 | Georgette | Leroy | g.leroy@example.com | 1 | Sebastien | Martin |
4 | Gregory | Roux | g.roux@example.com | 2 | Gustave | Dubois |