Après lecture, il ne s'agit pas d'un doublon de [Explicit vs Implicit SQL Joins][1]. La réponse peut être liée (ou même identique) mais la question est différente.
Quelle est la différence et que doit-on mettre dans chacune ?
Si je comprends bien la théorie, l'optimiseur de requêtes devrait être capable d'utiliser les deux de manière interchangeable.
[1] : https://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins
Ce n'est pas la même chose.
Considérez ces requêtes :
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345
et
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
AND Orders.ID = 12345
La première renverra une commande et ses lignes, le cas échéant, pour la commande numéro 12345
. La seconde renverra toutes les commandes, mais seule la commande 12345
sera associée à des lignes.
Avec un INNER JOIN
, les clauses sont effectivement équivalentes. Cependant, ce n'est pas parce qu'elles sont fonctionnellement identiques, c'est-à-dire qu'elles produisent les mêmes résultats, que ces deux types de clauses ont la même signification sémantique.
Sur INNER JOIN
s, ils sont interchangeables, et l'optimiseur les réarrangera à volonté.
Sur les OUTER JOIN
s, ils ne sont pas nécessairement interchangeables, selon le côté de la jointure dont ils dépendent.
Je les mets à l'une ou l'autre place en fonction de la lisibilité.
Sur une jointure interne, ils signifient la même chose. Cependant, vous obtiendrez des résultats différents dans une jointure externe selon que vous placez la condition de jointure dans la clause WHERE ou ON. Jetez un coup d'œil à [cette question connexe][1] et [cette réponse][2] (par moi).
Je pense qu'il est plus logique de prendre l'habitude de toujours placer la condition de jointure dans la clause ON (à moins qu'il ne s'agisse d'une jointure externe et que vous souhaitiez réellement la placer dans la clause where), car cela permet à toute personne lisant votre requête de savoir plus clairement sur quelles conditions les tables sont jointes, et cela permet également d'éviter que la clause WHERE ne fasse des dizaines de lignes.
[1] : https://stackoverflow.com/questions/219046/help-with-a-where-on-a-left-join-sql-query [2] : https://stackoverflow.com/questions/219046/help-with-a-where-on-a-left-join-sql-query#219053