Je devrais probablement le savoir maintenant, mais quoi, s'il s'agit de la différence entre les deux déclarations ci-dessous?
la joindre imbriquée: em> p> plus la jointure traditionnelle: em> p>
4 Réponses :
Pour votre exemple spécifique, je ne pense pas qu'il devrait y avoir une différence dans les plans de requête générés, mais il y a définitivement une différence de lisibilité. Votre 2e exemple est beaucoup plus facile à suivre.
Si vous deviez inverser les types de jointures dans l'exemple, vous pourriez vous retrouver avec beaucoup de résultats différents. P>
SELECT t1.* FROM table2 t2 INNER JOIN table3 t3 ON t3.table3_ID = t2.table2_ID RIGHT JOIN table1 t1 ON t2.table2_ID = t1.table1_ID
Eh bien, c'est l'ordre des opérations ..
SELECT t1.* FROM (table1 t1 INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID) -- first inner join LEFT JOIN -- then left join table3 t3 ON t3.table3_ID = t2.table2_ID -- the result with this
Il est clair que l'ordre des opérations est différent, mais y a-t-il une différence réelle (performance, résultats, quoi que ce soit)?
Veuillez donner un exemple de données dans lesquelles les requêtes rendraient des résultats différents. Je n'ai pas pu générer d'autre chose.
Ok, merci pour les pensées sur ces gars. C'est à peu près comme je pensais alors. Les résultats seront les mêmes, mais les requêtes peuvent se produire différemment. Je pense que la facilité d'utilisation, je vais changer l'ancienne requête (imbriquée) pour utiliser la syntaxe plus traditionnelle.
La meilleure façon de voir ce qui est différent dans ces deux requêtes consiste à comparer le plan de requête pour ces deux requêtes. P>
Il n'y a aucune différence dans les ensembles de résultats pour ces Je l'ai essayé sur ma base de données et la différence dans les plans de requête était que
1. Pour la première requête, l'optimiseur a choisi de faire la jointure sur la table2 et la table 3 d'abord.
2. Pour la deuxième requête, l'optimiseur a choisi de rejoindre la table1 et la table2 d'abord. P>
Pour moi, les plans d'exécution pour mes vraies requêtes étaient exactement les mêmes.
Vous ne devez voir aucune différence entre les deux requêtes, à condition que votre optimiseur de DBMS soit à la hauteur. Cela, cependant, même pour les plates-formes de grandes-fer, à haut coût, n'est pas une hypothèse que j'avais confiance en faisant, je serais donc assez surpris à découvrir que les plans de requête (et par conséquent des temps d'exécution) ont varié. P >
Est-ce qu'ils donnent le même résultat lorsque vous les exécutez?
C'est un diable de beaucoup plus facile de comprendre le second que le premier - même si vous mettez (parens) autour du LOJ dans la première. Au plaisir de voter une bonne réponse sur celui-ci.
Dans mes tests limités, oui, ils donnent le même résultat. Mais, je ne voulais pas faire d'hypothèses en fonction de cela depuis que je n'ai été testé que rapidement et avec des données limitées.
Yikes, ayant des flashbacks de réécriture Vues construites avec des concepteurs de requêtes "visuelles". L'horreur de la gauche et de droite se joint à une requête, une jointure imbriquée et essayant de comprendre l'ordre ou l'opération pour et / ou sans parens.