911 votes

Jointure SQL: d'où la clause ou la clause

Après l'avoir lu, c'est pas un doublon de l' Explicite vs Implicite des Jointures SQL. La réponse peut être lié (ou le même), mais la question est différente.


Quelle est la différence et ce qui doit aller dans chaque?

Si je comprends la théorie correctement, l'optimiseur de requête doit être en mesure d'utiliser à la fois de façon interchangeable.

1120voto

Joel Coehoorn Points 190579

Ils ne sont pas la même chose.

Tenir compte de ces requêtes:

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345

et

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID AND Orders.ID=12345

La première sera de retour à un ordre et ses lignes, le cas échéant, par ordre de numéro 12345. La deuxième sera de retour tous les ordres, mais seulement afin 12345 aura toutes les lignes associées.

Avec une JOINTURE INTERNE, les clauses sont effectivement équivalent. Cependant, juste parce qu'ils sont fonctionnellement le même, dans ce qu'ils produisent les mêmes résultats, ne signifie pas que les deux types de clauses ont la même signification sémantique.

652voto

Sandeep Jindal Points 1813

Juste respecté et ajouté un peu de réponse:

  • N'a pas d'importance pour les jointures internes.
  • Questions pour les jointures externes depuis jointure externe (disons à gauche) se joint donc à tous de la valeur à partir de la table de gauche, puis les valeurs de filtre. Selon l'endroit où la condition est mentionné, la filtration aurait-il de différent un. Dans la Jointure: Avant de les rejoindre.Ainsi, la possibilité d'avoir des valeurs nulles de droit de la table.
    b. dans les cas où: Après avoir rejoint. Ainsi, l'ensemble des dossiers (après l'adhésion) seront filtrés.

Examiner les tableaux ci-dessous:
1. Document:

 Doc_ID  Doc_name 
 1   Doc1 
 2   Doc2 
 3   Doc3 
 4   Doc4
 5   Doc5 

2 HasDownloaded:

 Download_ID   Doc_ID Member_Name 
 1    1   sandeep 
 2    1   simi 
 3    2   sandeep 
 4    2   reya 
 5    3   simi

Maintenant, la requête (avec clause where): sélectionnez doc.doc_name, hasd.downlaodID de Document doc jointure externe gauche HasDownloaded hasd sur la doc.doc_id = hasd.doc où member_name='no'

Sortie:

Doc_Name    Download_ID
 doc1   1 
 doc2   3 

Autre requête (avec clause de jointure): sélectionnez doc.doc_name, hasd.downlaodID de Document doc jointure externe gauche HasDownloaded hasd sur la doc.doc_id = hasd.doc et member_name='no'

Sortie:

Doc_Name    Download_ID
 doc1   1 
 doc2   3 
 doc3   null 
 doc4   null 
 doc5   null 

158voto

Cade Roux Points 53870

Sur INNER JOINs ils sont interchangeables, et l'optimiseur de les réorganiser à volonté.

Sur OUTER JOINs, ils ne sont pas nécessairement interchangeables, selon le côté de la jointure ils dépendent.

J'ai mis en place en fonction de la lisibilité.

72voto

HLGEM Points 54641

La façon dont je le fais, c'est:

Toujours mettre les conditions de jointure dans la clause Si vous faites une jointure interne, afin de ne pas ajouter n'importe où sur les conditions de la clause, les mettre dans la clause where

Si vous faites une jointure gauche, ajouter n'importe où sur les conditions de la clause de la table dans le côté droit de la rejoindre. C'est un must car l'ajout d'une clause where qui fait référence à la partie droite de la jointure va convertir le rejoindre pour une jointure interne (Avec une exception décrite ci-dessous).

L'exception est que lorsque vous êtes à la recherche pour les documents qui ne sont pas dans un tableau, vous pouvez ajouter la refernce à un identifiant unique(qui n'est pas toujours la valeur null) dans le droit de la table de jointure à la clause where de cette façon, "Où t2.idfield est nulle". Donc, le seul moment où vous devez faire référence à un tableau sur le côté droit de la jointure est de trouver les enregistrements qui ne sont pas dans le tableau.

37voto

matt b Points 73770

Sur une jointure interne, ils signifient la même chose. Cependant, vous obtiendrez des résultats différents dans une jointure externe en fonction de si vous mettez la condition de jointure dans la OÙ vs la clause. Jetez un oeil à cette question et cette réponse (par moi).

Je pense qu'il fait le plus de sens pour être dans l'habitude de toujours mettre la condition de jointure dans la clause (sauf si c'est une jointure externe et que vous voulez vraiment dans la clause where), car il fait plus clair pour toute personne lisant votre requête quelles conditions les tables sont jointes, et aussi il aide à prévenir la clause where d'être des dizaines de lignes de long.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X