Comment SQL travailler?
Je suis en train d'essayer de comprendre comment se joint à travailler à l'interne. Quelle sera la différence entre la façon dont les deux requêtes suivantes irait?
For example
(A)
Select *
FROM TABLE1
FULL JOIN TABLE2 ON TABLE1.ID = TABLE2.ID
FULL JOIN TABLE3 ON TABLE1.ID = TABLE3.ID
And
(B)
Select *
FROM TABLE1
FULL JOIN TABLE2 ON TABLE1.ID = TABLE2.ID
FULL JOIN TABLE3 ON TABLE2.ID = TABLE3.ID
Edit: je parle d'oracle ici.
Considérons quelques enregistrements présents dans le tableau 2 et le tableau 3, mais pas dans le tableau 1, la requête A deux lignes pour le relevé, mais B ne donner qu'une seule ligne.
- PLEIN est la même que EXTERNE COMPLÈTE. EXTÉRIEURE est ambigu (est-il de GAUCHE, de DROITE, ou PLEIN?) - mais la plupart vont l'interpréter pour être COMPLET.
- Une jointure EXTERNE COMPLÈTE renvoie toutes les lignes des DEUX tables, avec des valeurs Null pour les colonnes d'une table qui ne correspondent pas aux critères de jointure. Comme une sorte de JOINTURE EXTERNE GAUCHE et une JOINTURE EXTERNE DROITE combinés.
Vous devez vous connecter pour publier un commentaire.
Votre SGBD de l'optimiseur va déterminer la meilleure façon d'effectuer la requête. Habituellement, cela se fait par "coût de base de l'optimisation", où un certain nombre de différents plans de requête sont pris en considération et la plus efficace sélectionné. Si vos deux requêtes sont logiquement identiques, il est plus que probable que l'optimiseur finira par utiliser le même plan de requête selon la manière dont vous l'écrivez. En fait, ce serait une mauvaise utilisation de l'optimiseur de ces jours qui produit différents plans de requête basés sur de telles différences mineures dans le SQL.
Toutefois, les jointures externes sont une autre affaire (dans Oracle au moins), puisque la manière dont les colonnes sont rejoints influence le résultat. c'est à dire les 2 requêtes sont pas interchangeables.
Vous pouvez utiliser AUTOTRACE dans SQL Plus pour voir les différents plans:
En fait, les plans de requête sont identiques, sauf pour le Prédicat de l'information
Vous avez déclaré d'intérêt pour les "internes", et a ensuite demandé un exemple qui illustre la "sémantique". Je vais répondre à la sémantique.
Tenir compte de ces tables.
Les deux exemples effectuer la même la première, donc je vais effectuer ici.
L'Exemple (A)
L'Exemple (B)
Cela vous montre logiquement la façon de produire les résultats de la rejoint.
Pour "internals", il y a quelque chose qui s'appelle un optimiseur de requête, qui va produire les mêmes résultats, mais il fera de la mise en œuvre de choix à faire le calcul/io rapide. Ces choix incluent:
Également note: en raison de l'optimiseur de faire ces choix, et la modification de ces choix sur la base de ce qu'il considère être optimale - l'ordre des résultats peut changer. L'ordre par défaut des résultats est toujours "ce qui est plus facile". Si vous ne voulez pas la valeur par défaut de la commande, vous devez spécifier la commande dans votre requête.
Pour voir exactement ce que l'optimiseur de le faire avec une requête (à ce moment, car il peut changer d'avis), vous devez afficher le plan d'exécution.
EXPLIQUER l'utilisation PLAN:
http://download.oracle.com/docs/cd/B10500_01/server.920/a96533/ex_plan.htm
Avec Une requête à ce que vous obtenez des entrées dans le tableau 1 avec une entrée correspondante dans le tableau3 sans entrées correspondantes dans le tableau3 (les valeurs null pour les t2 colonnes)
Avec la requête B uou n'obtenez pas les écritures, parce que vous allez seulement à tableau3 par le biais de table2. Si vous n'avez pas d'entrée correspondante dans la table2, la table2.id sera nulle et ne pourra jamais correspondre à un tableau3.id
Pour la compréhension de Gauche à Droite/à les rejoindre, comment ils fonctionne Cochez cette