2010-04-24 6 views
5

Für SQL, seit wann es wünschenswert sein, immer die Wörter zu verwenden, anstatt implizit „Inner Join“ des Verbindens von:Wann war es für SQL wünschenswert, immer die Wörter "Inner Join" statt implizit mit Join zu verwenden?

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

? Ist es nur für Stil oder um zwischen Outer Join zu unterscheiden oder gibt es andere Gründe dafür?

+0

Für die Antworten, die „zu verhindern vorherigen Zweideutigkeiten“ sagen, können wir bitte ein Beispiel haben? – Oddthinking

Antwort

3

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.

+0

Ich lasse gerne INNER und OUTER stehen; zu viel Flaum. In all den Jahren, in denen ich mit '* =' und '= *' programmiert habe (und es gab ein paar), musste ich wegen Unklarheiten ein oder zwei Abfragen nacharbeiten. Trotzdem bevorzuge ich die neue Syntax. –

+0

Yah. Und Oracle Greulichen omega-join (+) Syntax verwendet: SELECT a, b, c aus q, r, wo qx = ry (+) sollte select a, b, c aus q LEFT JOIN R on qx = ry –

2

Es wurde wünschenswert, wenn die neue Syntax hinzugefügt wurde, um Inkonsistenzen mit Outer Join-Implementierungen zu behandeln.

Da die Kombination von äußeren und inneren Joins (und bestimmten Outer Joins beider Richtungen) mit der alten Syntax in vielen Fällen mehrdeutig ist, musste eine neue Syntax erstellt und implementiert werden, um dem Programmierer 100% Klarheit über die Reihenfolge zu geben Gruppierung der Join-Klauseln.

Es ist jedoch immer noch vollkommen legal, die alten inneren Verbindungen selbst zu schreiben, aber die äußeren Verbindungen der alten Art verschwinden in allen Formen und sind gut gelöst.

0

Es ist wünschenswert wurde, als es möglich wurde, ...

Das join Schlüsselwort besser beschreibt die Absicht, dass die „klassischen“ beizutreten. Wenn Sie viele Joins in einer Abfrage haben, erscheinen die zu verknüpfende Tabelle und die zu verwendende Bedingung nebeneinander, anstatt alle Tabellen an einer Stelle und alle Bedingungen in einer anderen zu haben.

0

Ich glaube, es ist der ANSI-Standard. Es sollte einen Fehler zurückgeben, wenn das ON-Schlüsselwort weggelassen wird, und (IMO) ist ein deklarativer Stil.

0

ansi-92-Standard hmmm das ist ein hartes ich auf einem Bein gehen werde ich und denke, 1992