Bon, il est temps de parler de la vraie vie. Celle où tu ne peux pas y échapper : les erreurs. Les choper, les corriger et les comprendre — c'est juste une partie obligatoire du taf avec les données. On va voir ensemble sur quels râteaux tu peux marcher avec JOIN en SQL, et comment les éviter.
Erreur 1 : Oublier la condition de jointure — création d’un produit cartésien
L’erreur la plus fréquente — oublier de préciser la condition de jointure avec ON. Là, tu te retrouves avec un produit cartésien, où chaque ligne de la première table est jointe à chaque ligne de la seconde. Résultat : t’as un max de lignes qui ne veulent rien dire et qui te mettent juste la tête à l’envers.
Regarde cet exemple. Disons qu’on a ces tables :
Étudiants (students):
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
Cours (courses):
| course_id | course_name |
|---|---|
| 101 | Mathématiques |
| 102 | Histoire |
Maintenant, on écrit une requête en oubliant le ON :
SELECT *
FROM students
JOIN courses;
Résultat :
| student_id | name | course_id | course_name |
|---|---|---|---|
| 1 | Otto | 101 | Mathématiques |
| 1 | Otto | 102 | Histoire |
| 2 | Anna | 101 | Mathématiques |
| 2 | Anna | 102 | Histoire |
Ça n’a aucun sens, non ? Ce cauchemar, c’est ce qu’on appelle le produit cartésien.
Comment corriger : utilise ON pour dire comment les données sont liées entre les tables.
SELECT *
FROM students
JOIN courses
ON students.student_id = courses.course_id;
Et là, une nouvelle galère peut arriver...
Protection contre les bourdes
C’est tellement courant comme souci que PostgreSQL interdit d’utiliser JOIN sans ON et condition.
Si tu veux vraiment tout combiner avec tout, tu peux utiliser la syntaxe sans JOIN :
SELECT *
FROM students, courses;
Encore une 3ème option — quand JOIN sans ON marche :
- Avec
NATURAL JOIN— il prend automatiquement les colonnes qui ont le même nom. - Avec
USING— tu précises la liste des colonnes sur lesquelles joindre. CROSS JOIN— toujours sans condition, c’est pareil que le produit cartésien.
Erreur 2 : Mauvaise condition de jointure
Parfois tu mets une condition de jointure, mais tu te plantes. Genre tu joins les tables sur des colonnes qui n’ont rien à voir.
Imaginons qu’on veut la liste des étudiants et des cours auxquels ils sont inscrits, mais on se trompe et on joint sur des champs qui n’ont aucun rapport :
SELECT *
FROM students
JOIN courses
ON students.student_id = courses.course_id;
Cette requête va donner un résultat bidon, parce que student_id et course_id — c’est pas du tout la même chose.
Comment corriger : vérifie bien que tu utilises les bonnes colonnes pour joindre. Une jointure correcte pourrait ressembler à ça (si t’as une table enrollments qui relie étudiants et cours) :
SELECT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;
Erreur 3 : Duplication de lignes dans le résultat
Quand tu ajoutes plusieurs JOIN dans ta requête, parfois ça fait des doublons. Ça arrive si t’as des enregistrements en double dans les tables JOIN, ou si t’as mal mis tes conditions de jointure.
Par exemple, l’étudiant Otto est inscrit deux fois au même cours dans la table enrollments.
Enregistrements dans enrollments :
| student_id | course_id |
|---|---|
| 1 | 101 |
| 1 | 101 |
Maintenant, la requête avec JOIN donne ça :
SELECT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;
Résultat :
| name | course_name |
|---|---|
| Otto | Mathématiques |
| Otto | Mathématiques |
Comment corriger : d’abord, vérifie qu’il n’y a pas de doublons dans tes tables. Sinon, si c’est normal, enlève les doublons avec DISTINCT :
SELECT DISTINCT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;
Erreur 4 : Perte de lignes avec INNER JOIN
INNER JOIN ne renvoie que les lignes qui matchent dans les deux tables. Si une des tables n’a pas la valeur correspondante, la ligne saute. Tu peux perdre des données si tu choisis pas le bon type de jointure.
Par exemple, on a un étudiant qui n’est inscrit à aucun cours :
Étudiants (students):
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
| 3 | Dhany |
Inscriptions (enrollments):
| student_id | course_id |
|---|---|
| 1 | 101 |
| 2 | 102 |
Maintenant, la requête avec INNER JOIN :
SELECT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;
Résultat :
| name | course_name |
|---|---|
| Otto | Mathématiques |
| Anna | Histoire |
Mais où est Dhany ? Si tu veux inclure les étudiants sans cours, il faut utiliser LEFT JOIN :
SELECT students.name, courses.course_name
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
LEFT JOIN courses ON enrollments.course_id = courses.course_id;
Erreur 5 : Mauvaise gestion des valeurs NULL
Si t’as des lignes avec des valeurs vides (NULL) dans une table, elles peuvent disparaître du résultat (genre si tu filtres après).
Exemple : tu utilises LEFT JOIN, mais ensuite tu ajoutes un WHERE pour filtrer.
SELECT students.name, courses.course_name
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
LEFT JOIN courses ON enrollments.course_id = courses.course_id
WHERE courses.course_name = 'Mathématiques';
Du coup, les étudiants sans cours ne seront pas dans le résultat, même si t’as utilisé LEFT JOIN.
Comment corriger : si tu veux inclure les lignes sans cours, remplace WHERE par ON ou ajoute une condition :
SELECT students.name, courses.course_name
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
LEFT JOIN courses ON enrollments.course_id = courses.course_id
WHERE courses.course_name IS NULL OR courses.course_name = 'Mathématiques';
Erreur 6 : Confusion entre les types de jointures
Tu t’emmêles les pinceaux sur quel type de jointure utiliser. Genre tu mets un RIGHT JOIN alors qu’un LEFT JOIN aurait suffi, juste en changeant l’ordre des tables.
Comment éviter la confusion :
- Utilise
LEFT JOINsi tu peux. C’est plus intuitif. - Change l’ordre des tables pour éviter d’avoir besoin de
RIGHT JOIN.
GO TO FULL VERSION