LEFT JOIN avec conditions : où est la différence entre ON et WHERE ?
Dans SQL Server, LEFT JOIN combine les lignes de deux tables en fonction de une condition de jointure spécifiée. Alors que la clause ON définit la condition de jointure dans l'instruction LEFT JOIN, la clause WHERE filtre les lignes après l'opération de jointure. Cette distinction subtile peut conduire à des résultats inattendus si elle n'est pas correctement comprise.
Considérez la requête suivante :
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 AND t2.f3 > something
Étonnamment, cette requête ne produit pas les mêmes résultats que la suivante :
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 WHERE t2.f3 > something
L'explication
La clause ON joue un rôle crucial pour déterminer quel les lignes participent à la jointure. La condition spécifiée dans ON doit être vraie pour que les lignes correspondent et soient incluses dans le résultat de la jointure. En revanche, la clause WHERE filtre les lignes déjà jointes.
Dans la première requête, la condition t2.f3 > quelque chose fait partie de la clause ON. Par conséquent, seules les lignes où t2.f3 est supérieur à quelque chose seront incluses dans la jointure. Cela signifie que toutes les lignes correspondantes où t2.f3 n'est pas supérieur à quelque chose seront exclues du résultat.
Dans la deuxième requête, la condition t2.f3 > quelque chose fait partie de la clause WHERE. Cette clause est évaluée une fois la jointure effectuée. Par conséquent, toutes les lignes qui satisfont à la condition de la clause ON (t1.f1 = t2.f1 et cond2) feront partie du résultat de la jointure. La clause WHERE filtre ensuite ces lignes, ne retenant que celles où t2.f3 est supérieur à quelque chose.
Exemple
Pour illustrer ce concept, considérons un tableau de candidats ( candidats) et un tableau des votes (votes). Si nous voulons trouver des candidats qui ont reçu des votes, nous pouvons utiliser un LEFT JOIN :
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for
Cette requête renvoie tous les candidats, même ceux qui n'ont reçu aucun vote. Si on déplace la condition vers la clause WHERE :
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for WHERE v.voted_for IS NOT NULL
Les résultats incluent désormais uniquement les candidats ayant reçu au moins un vote.
Conclusion
Comprendre la différence entre les clauses ON et WHERE dans un LEFT JOIN est crucial pour manipuler efficacement les données. En plaçant soigneusement les conditions dans les clauses appropriées, vous pouvez vous assurer que vos requêtes renvoient les résultats souhaités.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!