6
votes

SQL - Différence entre ces jointures?

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: xxx

plus la jointure traditionnelle: xxx


4 commentaires

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.


4 Réponses :


4
votes

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


0 commentaires

5
votes

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


3 commentaires

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.



2
votes

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.

Il n'y a aucune différence dans les ensembles de résultats pour ces si il y a toujours des rangées dans le tableau3 pour une rangée donnée dans le tableau2.

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.


1 commentaires

Pour moi, les plans d'exécution pour mes vraies requêtes étaient exactement les mêmes.



0
votes

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é.


0 commentaires