Die INNER- und OUTER JOIN-Syntax wurde in der SQL-92-Spezifikation formalisiert. In vielen Datenbankprodukten wie MySQL und SQL Server können Sie das Wort "INNER" von inneren Joins weglassen und einfach "JOIN" verwenden. In ähnlicher Weise können Sie bei vielen Datenbankprodukten das Wort "OUTER" weglassen und einfach "LEFT JOIN" oder "RIGHT JOIN" für äußere Joins verwenden. Die alte äußere Joinsyntax von *=
oder =*
erzeugte in vielen Fällen Mehrdeutigkeiten. Viele Produkte haben oder werden sehr bald aufhören, die alte Outer-Join-Syntax zu unterstützen.
Vor der SQL-92-Spezifikation verwendeten die Hersteller jeweils ihre eigene Syntax, die auf eine äußere Verknüpfung hinwies. Ie., *=
war nicht universal (ich erinnere mich an jemanden mit ?=
). Außerdem haben sie die äußere Verknüpfung nicht universell implementiert. Nehmen Sie das folgende Beispiel:
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
Die obige Abfrage würde in der Regel ergeben:
1 1 1 Alice
2 2 2 Bob
3 3 Null Null
4 4 Null Null
Jetzt versuchen:
Select
From Table1, Table2
Where Table2.Col1 *= Table1.Col1
And Table2.Name = 'Alice'
Bei einigen Datenbankprodukten, Sie erhalten würden:
1 1 1 Alice
Auf anderen würden Sie erhalten:
1 1 1 Alice
2 2 Null Null
3 3 Null Null
4 4 Null Null
Kurz gesagt, es, ob die Filterung auf der unpreserved Tabelle vor angewandt werden soll oder nach dem Join zweideutig.
Für die Antworten, die „zu verhindern vorherigen Zweideutigkeiten“ sagen, können wir bitte ein Beispiel haben? – Oddthinking