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.
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