2008-12-27 5 views
25

les deux bits de SQL obtenir le même résultat ci-dessousSQL jointure interne syntaxe

SELECT c.name, o.product 
FROM customer c, order o 
WHERE c.id = o.cust_id 
AND o.value = 150 

SELECT c.name, o.product 
FROM customer c 
INNER JOIN order o on c.id = o.cust_id 
WHERE o.value = 150 

J'ai vu les deux styles utilisés comme standard à différentes entreprises. D'après ce que j'ai vu, le deuxième est ce que la plupart des gens recommandent en ligne. Y a-t-il une vraie raison à cela autre que le style? Est-ce que l'utilisation d'une jointure interne a parfois de meilleures performances? J'ai remarqué que les développeurs Ingres et Oracle ont tendance à utiliser le premier style, alors que les utilisateurs de Microsoft SQL Server ont eu tendance à utiliser le second, mais cela pourrait être une coïncidence.

Merci pour toute idée, je me suis posé la question depuis un moment. Editer: J'ai changé le titre de "Inner Join SQL par rapport au produit cartésien" car j'utilisais le terminlogy incorrect. Merci pour toutes les réponses à ce jour.

Répondre

25

Les deux requêtes sont des jointures internes et équivalentes. La première est l'ancienne méthode de faire les choses, alors que l'utilisation de la syntaxe JOIN n'est devenue commune qu'après l'introduction de la norme SQL-92 (je crois que c'est dans les définitions plus anciennes).

L'utilisation de la syntaxe JOIN est fortement préférée car elle sépare la logique de jointure de la logique de filtrage dans la clause WHERE. Alors que la syntaxe JOIN est vraiment syntactique pour les jointures internes, sa force réside dans les jointures externes où l'ancienne syntaxe * peut produire des situations où il est impossible de décrire la jointure sans ambiguïté et dont l'interprétation dépend de l'implémentation. Le [GAUCHE | DROITE] La syntaxe JOIN évite ces pièges et, par conséquent, pour des raisons de cohérence, l'utilisation de la clause JOIN est préférable en toutes circonstances.

Notez qu'aucun de ces deux exemples ne sont des produits cartésiens.Pour que vous souhaitez utiliser soit

SELECT c.name, o.product 
FROM customer c, order o 
WHERE o.value = 150 

ou

SELECT c.name, o.product 
FROM customer c CROSS JOIN order o 
WHERE o.value = 150 
+1

La notation JOIN a été introduite dans SQL-92; il n'est devenu dominant que beaucoup plus tard. –

+0

Merci pour la correction, j'ai vérifié pour voir si je pouvais trouver la date. Personnellement, je ne me suis vraiment converti à l'utilisation de JOINS vers 2001 ou 2 - j'ai trouvé l'utilisation un peu étrange au début mais beaucoup préfère maintenant. – Cruachan

3

Les deux requêtes effectuent une jointure interne, mais une syntaxe différente.

4

En fait, ces exemples sont équivalents et aucun n'est un produit cartésien. Un produit cartésien est retourné lorsque vous joignez deux tables sans spécifier une condition de jointure, comme dans

select * 
from t1,t2 

Il y a une bonne discussion de ce sur Wikipedia.

6

Pour répondre à une partie de votre question, je pense que les bogues précoces de la syntaxe JOIN ... ON dans Oracle ont découragé les utilisateurs Oracle de s'éloigner de cette syntaxe. Je ne pense pas qu'il y ait de problèmes particuliers maintenant.

Ils sont équivalents et doivent être analysés dans la même représentation interne pour l'optimisation.

+0

Certains des bogues dans la syntaxe ANSI JOIN ne sont pas ce que j'appellerais "early". Lors d'un précédent travail où nous avons fait beaucoup de requêtes énormes, nous avons rencontré une limite stricte sur le nombre total de colonnes que vous pourriez avoir dans une requête si vous utilisiez la syntaxe ANSI JOIN. Vous constaterez qu'au moins aussi tard que la version 10g il y avait encore des problèmes. –

+0

Oui, je n'utilise toujours pas les jointures ANSI. –

4

Oracle était en retard dans la prise en charge de la syntaxe JOIN ... ON (ANSI) (pas avant Oracle 9), c'est pourquoi les développeurs Oracle ne l'utilisent souvent pas.

Personnellement, je préfère utiliser la syntaxe ANSI lorsqu'il est logique qu'une table conduit la requête et que les autres sont des tables de recherche. Quand les tables sont "égales", j'ai tendance à utiliser la syntaxe cartésienne.

La performance ne doit pas différer du tout.

3

La JOIN ... ON ... syntaxe est un ajout plus récent aux spécifications ANSI et ISO pour SQL. La syntaxe JOIN ... ON ... est généralement préférée car elle 1) déplace les critères de jointure hors de la clause WHERE rendant la clause WHERE juste pour le filtrage et 2) le rend plus évident si vous créez un produit Cartésien redouté puisque chaque JOIN doit être accompagné d'au moins une clause ON. Si tous les critères de jointure sont juste ANDed dans la clause WHERE, ce n'est pas aussi évident quand un ou plusieurs sont manquants.

Questions connexes