2010-04-24 11 views
5

Pour SQL, quand at-il commencé à être souhaitable de toujours utiliser les mots « INNER JOIN » au lieu de se joindre implicitement par:Pour SQL, quand a-t-il été souhaitable d'utiliser toujours les mots "Inner Join" au lieu d'implicitly joinly?

select * from t1, t2 where t1.ID = t2.ID; 

? Est-ce juste pour le style ou pour distinguer la jointure externe ou y a-t-il d'autres raisons?

+0

Pour les réponses qui disent « pour éviter les ambiguïtés précédentes », peut-on s'il vous plaît un exemple? – Oddthinking

Répondre

3

La syntaxe INNER et OUTER JOIN a été formalisée dans la spécification SQL-92. Dans de nombreux produits de base de données tels que MySQL et SQL Server, vous pouvez omettre le mot "INNER" des jointures internes et simplement utiliser "JOIN". De même, de nombreux produits de base de données vous permettent d'omettre le mot "OUTER" et d'utiliser simplement "LEFT JOIN" ou "RIGHT JOIN" pour les jointures externes. L'ancienne syntaxe de jointure externe de *= ou =* a créé des ambiguïtés dans de nombreuses circonstances. De nombreux produits ont ou vont bientôt cesser de prendre en charge l'ancienne syntaxe de jointure externe.

Avant la spécification SQL-92, les fournisseurs utilisaient chacun leur propre syntaxe pour indiquer une jointure externe. I.e., *= n'était pas universelle (je me souviens de quelqu'un en utilisant ?=). En outre, ils n'ont pas implémenté la jointure externe de manière universelle. Prenons l'exemple suivant:

Table1 
Col1 Col2 
1  Alice 
2  Bob 

Table2 
Col1 Col2 
1   1 
2   2 
3   3 
4   4 

Select 
From Table1, Table2 
Where Table2.Col1 *= Table1.Col1 

La requête ci-dessus aurait généralement donné:

1 1 1  Alice 
2 2 2  Bob 
3 3 Null Null 
4 4 Null Null 

Essayez maintenant:

Select 
From Table1, Table2 
Where Table2.Col1 *= Table1.Col1 
    And Table2.Name = 'Alice' 

Sur certains produits de base de données, vous obtiendrez:

1 1 1  Alice 

Sur d'autres vous auriez obtenez:

1 1 1  Alice 
2 2 Null Null 
3 3 Null Null 
4 4 Null Null 

En bref, il est ambigu quant à savoir si le filtrage sur la table sans conservateur doit être appliquée avant ou après la jonction.

+0

J'aime laisser l'intérieur et l'extérieur; trop de peluches. Dans toutes mes années de programmation avec '* =' et '= *' (et il y en avait quelques unes), je pense que j'ai dû retravailler une ou deux requêtes à cause d'ambiguïtés. Même ainsi, je préfère la nouvelle syntaxe. –

+0

Yah. Et Oracle utilise l'abominable oméga-join (+) Syntaxe: SELECT a, b, c DE q, r qx ry (+) doit être SELECT a, b, c DE q LEFT JOIN r sur qx = ry –

2

Il est devenu souhaitable lorsque la nouvelle syntaxe a été ajoutée pour gérer les incohérences avec les implémentations de jointures externes. Puisque la combinaison des jointures externes et internes (et des jointures externes particulières des deux directions) avec l'ancienne syntaxe est ambiguë dans de nombreux cas, une nouvelle syntaxe a dû être créée et implémentée pour permettre au programmeur d'être clair à 100% sur la commande et regroupement des clauses de jointure.

Cependant, il est encore parfaitement légal d'écrire les jointures internes de style ancien par elles-mêmes, mais les jointures externes de style ancien disparaissent sous toutes les formes, et sont bien débarrassées.

0

Il est devenu souhaitable quand il est devenu possible ...

Le meilleur mot-clé join décrit l'intention que le « classique » se joindre. En outre, lorsque vous avez plusieurs jointures dans une requête, la table à joindre et la condition à utiliser s'affichent côte à côte au lieu d'avoir toutes les tables dans un endroit et toutes les conditions dans une autre.

0

Je crois que c'est la norme ANSI. Il devrait retourner une erreur lorsque le mot clé ON est omis, et (IMO) est un style plus déclaratif.

0

ansi-92 norme hmmm qui est un disque que je vais sortir sur un membre et devinez 1992