web-dev-qa-db-fra.com

SQL JOIN où placer la condition WHERE?

J'ai deux exemples suivants.

1. Exemple (OERE)

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id
 WHERE t2.field = true

2. Exemple (JOIN AND)

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id AND t2.field = true

Quel est le moyen le plus rapide en termes de performances? Que préfères-tu?

30
Aley

Si un filtre entre fonctionnellement dans une condition JOIN (c'est-à-dire qu'il s'agit d'une condition de jointure réelle, pas seulement d'un filtre), il doit apparaître dans la clause ON de cette jointure.

À noter:

  • Si vous le placez à la place dans la clause WHERE, les performances sont les mêmes si la jointure est INNER, sinon elle diffère. Comme mentionné dans les commentaires, cela n'a pas vraiment d'importance car de toute façon le résultat est différent.

  • Le fait de placer le filtre dans la clause WHERE lorsqu'il s'agit réellement d'une condition OUTER JOIN Annule implicitement la nature OUTER de la condition ("joindre même quand il n'y a pas d'enregistrements") car ceux-ci les filtres impliquent qu'il doit y avoir des enregistrements existants en premier lieu. Exemple:

... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5 Est correct

... table1 t LEFT JOIN table2 u ON ... 
WHERE t2.column = 5 

est incorrect, car t2.column = 5 indique au moteur que des enregistrements de t2 sont attendus, ce qui va à l'encontre de la jointure externe. Une exception à cela serait un filtre IS NULL, Tel que WHERE t2.column IS (NOT) NULL (qui est en fait un moyen pratique de construire des jointures externes conditionnelles)

  • LEFT et RIGHT jointures sont implicitement OUTER jointures.

J'espère que cela a aidé.

17
Sebas

JOIN les conditions doivent normalement être indépendantes des conditions du filtre. Vous définissez les règles de votre jointure (le comment) avec ON. Vous filtrez quoi vous voulez avec WHERE. En termes de performances, il n'y a pas de règle générale pour tous les moteurs et tous les modèles, votre kilométrage variera donc considérablement.

6
MPelletier

Je pense que le moyen le plus rapide est de placer le filtre dans la clause where, car il procédera d'abord à ce filtre dans la clause where, puis la clause join, il n'y aura donc pas besoin de permutation de filtres.

0
Artemination