Quelle est la différence entre la clause where et sur la clause lors de la table jointure gauche?
SQL1:
select t1.f1,t2.f2
from t1
left join t2 on t1.f1 = t2.f2 and t1.f2=1 and t1.f3=0
SQL2:
select t1.f1,t2.f2
from t1
left join t2 on t1.f1 = t2.f2
where t1.f2=1 and t1.f3=0
La différence est là et sur la clause, est-il le même résultat? et quelle est la différence ? ne SGBD exécuter de la même manière? merci.
Avez-vous lu tous d'entre eux: stackoverflow.com/search?q=join+?
ok ,je vais le lire ,je ne sais pas comment exprimer le sujet en anglais normal.
J'ai expliqué brièvement ci-après dans mes messages
ok ,je vais le lire ,je ne sais pas comment exprimer le sujet en anglais normal.
J'ai expliqué brièvement ci-après dans mes messages
OriginalL'auteur SleeplessKnight | 2011-11-29
Vous devez vous connecter pour publier un commentaire.
La
where
clause s'applique à l'ensemble du jeu de résultats; l'clause
ne s'applique qu'à la rejoindre en question.Dans l'exemple fourni, toutes les conditions supplémentaires liées à des domaines sur le côté intérieur de la jointure, en cet exemple, les deux requêtes sont effectivement identiques.
Toutefois, si vous avez inclus une condition sur une valeur dans le tableau de la extérieur côté de la jointure, cela aurait fait une différence significative.
Vous pouvez obtenir de plus à partir de ce lien: http://ask.sqlservercentral.com/questions/80067/sql-data-filter-condition-in-join-vs-where-clause
Par exemple:
- faire des choses différentes - la première jointure gauche à t2 enregistrements où f4 est 1, tandis que le second a effectivement été tourné le dos, dans une jointure interne à t2.
GMTA. 🙂
OriginalL'auteur
La première requête est plus rapide que la seconde comme la condition de jointure est plus spécifique que la seconde: il n'a pas de sens pour le retour des dossiers qui vous permettra de filtre avec la clause where (il serait préférable de ne pas les renvoyer à tout query1)
De toute façon ça dépend vraiment de par l'optimiseur de requête.
avoir un regard sur les ci-dessous:
Est une JOINTURE plus rapide qu'un OÙ?
Un décent optimiseur va probablement créer le même plan d'exécution pour les deux états, donc je doute qu'il y aura une différence de performance.
les gars, vous êtes tous les deux raison, mais c'est vraiment dépendre de l'Optimiseur stackoverflow.com/questions/1129923/...
Je vous suggère d'ajouter le lien à votre réponse - je pense qu'il serait plus utile.
OriginalL'auteur Massimiliano Peluso
L'algèbre relationnelle permet l'interchangeabilité des prédicats dans la clause where et la JOINTURE INTERNE, de sorte que même à l'INTÉRIEUR des requêtes de JOINTURE avec les clauses where peut avoir les prédicats rearrranged par l'optimiseur de sorte qu'ils peuvent être exclus lors de la jonction.
Je vous recommande d'écrire les requêtes dans la plupart des readble façon possible.
Parfois, cela inclut la mise à la JOINTURE INTERNE relativement "incomplet" et de mettre certains de ces critères dans les OÙ tout simplement pour faire les listes de critères de filtrage plus facilement maintenable.
Vous pouvez obtenir de plus à partir de ce lien:
http://ask.sqlservercentral.com/questions/80067/sql-data-filter-condition-in-join-vs-where-clause
Par exemple, au lieu de:
Écrire:
Mais elle dépend, bien sûr.
OriginalL'auteur Somnath Muluk
1)
En cela, l'analyseur vérifie chaque ligne de t1 à chaque ligne de t2 avec ces 3 conditions. Obtenir un résultat plus rapide.
2)
SQL2: select t1.f1,t2.f2 from t1 left join t2 on t1.f1 = t2.f2 **where** t1.f2=1 and t1.f3=0
Dans ce, joindre seulement prendre la 1ère condition, puis le résultat obtenu à partir de jointure est filtrée avec ces 2 conditions. Et prendra plus de temps que le 1er requête.
Vous pouvez obtenir de plus à partir de ce lien: http://ask.sqlservercentral.com/questions/80067/sql-data-filter-condition-in-join-vs-where-clause
Essentiellement la même réponse que Massimiliano, et donc pas forcément vrai pour la même raison.
Voir la Marque, le commentaire ci-dessus; la performance dépend du fournisseur de base de données. Cependant, le résultat devrait être le même pour cet exemple pour tous les SGBDR.
La plupart des SGBDR produits permettra d'optimiser à la fois les requêtes de la même manière. Dans "Performances SQL Tuning" par Peter Gulutzan et Trudy Pelzer, ils ont testé plusieurs marques de SGBDR et n'a trouvé aucune différence de performances. Je préfère garder les conditions de jointure distincte de restriction de requête conditions. Si vous utilisez une JOINTURE EXTERNE parfois, il est nécessaire de mettre les conditions de la clause de jointure.
OriginalL'auteur Somnath Muluk
Les deux requêtes sont PAS identiques.
Mark Bannister a raison de souligner que le
where
clause est appliquée à la totalité des résultats, mais leclause
s'applique à la jointure.Dans votre cas, pour SQL 1 LEFT JOIN conditions de filtre joint sur la droite, mais la gauche est toujours retourné avant tout OÙ le filtrage. Puisqu'il n'existe pas, OÙ les conditions de t1 est toujours retourné.
Dans SQL 2, le LEFT JOIN conditions de filtrer des résultats montrant sur le droit, mais encore tous les t1 est retourné. Mais cette fois, OÙ les conditions peuvent filtrer des enregistrements de t1 loin.
INSERT INTO `t1` (`f1`,`f2`,`f3`) VALUES (1,1,1);
INSERT INTO `t2` (`f3`) VALUES (1);
Puisqu'ils pointent à une logique différente de la requête doit être écrite basée sur cela et il nous donne beaucoup de puissance et de flexibilité.
Une JOINTURE INTERNE cependant renvoie le même résultat si oui vérifier l'optimiseur.
OriginalL'auteur Nicholas