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
3 Réponses :
Votre première requête est évaluée comme suit qui n'est pas logiquement identique à la deuxième requête. C'est pourquoi, vous obtenez un résultat différent. P> Si vous avez utilisé NB: STRUT> La requête ci-dessus vous donnera une erreur car Joindre interne code> au lieu de
Joindre extérieur gauche code> Vous obtenez le même résultat pour les deux requêtes. < / P>
tbl2 code> et
tbl3 code> 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. P> p>
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): i.e. Il modifie l'ordre des opérations, Comme cela supprimerait également tout enregistrement de 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é>
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
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. P>
Mettre la clause sur la clause directement sur les tables à relever la rend plus lâche. P>
Donc, ma recommandation est de faire TB1 laissé de sortie rejoindre TBL23 sur tb1.xxx = tb2.yyy p>
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 CODE> -S? Parce que ce que vous décrivez aurait un sens si la seconde rejoindre était en fait un
rejoindre interne code> ou un
joint externe droit code>.
@ 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.