0
votes

Quelle est la différence entre spécifier "sur" à une jointure et après toutes les jointures?

Je suis tombé sur un code qui rejoint deux tables et Spécifie le lien (la clause "sur") entre les trois tables à la fin.

Le code a été écrit comme ceci: p>

SELECT *
FROM tb1 AS a  
LEFT OUTER JOIN tbl2 AS b ON a.ColA = b.ColA
LEFT OUTER JOIN tbl3 AS c ON b.ColA = c.ColA 


5 commentaires

Pouvez-vous poster à la fois votre résultat ou la différence de résultat.


@Darkrob j'ai vu ce script hier et je ne me souviens honnêtement que je me souviens bien que depuis que Proc je cherchais. J'ai vraiment besoin d'une explication quant à la différence entre les deux scripts.


Il semble que une syntaxe ennuyeuse tombait à travers les fissures.


Êtes-vous certain que les deux jointures étaient Gauche Extérieur Join -S? Parce que ce que vous décrivez aurait un sens si la seconde rejoindre était en fait un rejoindre interne ou un joint externe droit .


@ Ongaleo-yodavellem. . . J'ai supprimé les balises de base de données incompatibles. Il s'avère que votre question concerne la standard SQL. La base de données n'a donc pas d'importance.


3 Réponses :


1
votes

Votre première requête est évaluée comme suit xxx

qui n'est pas logiquement identique à la deuxième requête. C'est pourquoi, vous obtenez un résultat différent.

Si vous avez utilisé Joindre interne au lieu de Joindre extérieur gauche Vous obtenez le même résultat pour les deux requêtes. < / P>

NB: La requête ci-dessus vous donnera une erreur car tbl2 et tbl3 ont les deux une colonne avec le même nom. Donc, vous devrez peut-être avoir besoin d'alias pour exécuter la requête ci-dessus correctement.


0 commentaires

3
votes

Je suis surpris que les deux requêtes produisent des résultats différents, car ils ont l'air logiquement équivalent à moi. Comme une autre réponse a souligné, cela est logiquement équivalent à la requête suivante (mais sans erreur de colonne en double): xxx pré>

i.e. Il modifie l'ordre des opérations, tbl2 code> est joint à tbl3 code>, d'abord, alors le résultat de cette requête est jointe à tb1 code>. Ceci est généralement plus utile lorsque vous devez REJOITION INTERNE CODE> sur une table qui fait déjà partie d'un jointure extérieure code>. Par exemple, si vous ne vouliez que revenir enregistrer des enregistrements de tbl2 code> où l'entrée correspondante était dans tbl3 code>, vous ne pouvez pas modifier la requête d'origine à ceci: p> xxx pré>

Comme cela supprimerait également tout enregistrement de tb1 code> sans entrée correspondante dans tbl2 code>, tandis que si vous l'avez écrit comme ceci: P>

-- QUERY 1 & 2
T1.ColA     T2.ColA     T3.ColA
----------------------------------
1           1           1
2           2           NULL
3           NULL        NULL

-- QUERY 3
T1.ColA     T2.ColA     T3.ColA
----------------------------------
1           1           1

-- QUERY 4
T1.ColA     T2.ColA     T3.ColA
----------------------------------
1           1           1
2           NULL        NULL
3           NULL        NULL


0 commentaires

-2
votes

Veuillez noter que la base de données est libre de décider de la commande de traiter les tables. Donc, surtout Oracle changera la requête à son goût sur ses statistiques internes. Bien sûr seulement d'une manière qui conduit logiquement aux mêmes résultats.

Mettre la clause sur la clause directement sur les tables à relever la rend plus lâche.

Donc, ma recommandation est de faire TB1 laissé de sortie rejoindre TBL23 sur tb1.xxx = tb2.yyy


0 commentaires