Was ist der Unterschied zwischen Join in FROM-Klausel und WHERE-Klausel?

8

Wir haben ein Oracle 10g und die meisten unserer Anwendungen laufen mit Oracle Forms 6i. Ich habe festgestellt, dass alle in views / packages / procedures / functions geschriebenen Abfragen auf WHERE-Klausel-Ebene JOINING-Tabellen sind. Beispiel

%Vor%

Diese Abfrage gilt nur für ORACLE, da sie das Qualifikationsmerkmal (+) join aufweist, das in anderen SQL-Plattformen nicht akzeptabel ist. Die obige Abfrage entspricht:

%Vor%

Keine der Abfragen, die ich gesehen habe, wird geschrieben, wenn in der FROM-Klausel ein Join stattfindet.

Meine Frage kann in drei Teile unterteilt werden:

F: Angenommen, ich habe die gleiche Oracle-Umgebung, welche Abfrage ist besser in Bezug auf Leistung, Cache, CPU-Auslastung, etc. Die erste (Beitritt bei WHERE) oder die zweite (Beitritt bei FROM)

F: Gibt es eine andere Implementierung von SQL, die das (+) Join-Qualifikationsmerkmal anders als oracle akzeptiert? wenn ja, welche?

F: Vielleicht ist der Join bei der WHERE-Klausel geschrieben, was die Abfrage lesbarer macht, aber die Fähigkeit, LINKS / RECHTS beizutreten, kompromittiert, deshalb war (+) für. Wo kann ich mehr über den Ursprung dieses (+) lesen und warum wurde es speziell für Oracle erfunden?

    
Ahmad 25.11.2013, 07:44
quelle

4 Antworten

9

Q1. Kein Unterschied. Sie können es mit Profiling überprüfen und den Ausführungsplan vergleichen.

Q2. Wie ich weiß, unterstützen nur Orakel es. Es wird jedoch nicht empfohlen, in der neuesten Version von Oracle RDBMS zu verwenden:

  

Oracle empfiehlt die Verwendung der FROM-Klausel OUTER JOIN-Syntax   anstatt den Oracle-Join-Operator. Outer Join-Abfragen, die das verwenden   Oracle Join Operator (+) unterliegen den folgenden Regeln und   Einschränkungen, die nicht für die FROM-Klausel OUTER JOIN gelten:

Q3. Oracle "erfinden" (+) vor Outer Join wurde in SQL ANSI angegeben.

    
Sergey N Lukin 25.11.2013, 07:53
quelle
4

Es sollte keinen Leistungsunterschied geben. Angenommen, Sie befinden sich in einer vage aktuellen Version von Oracle, konvertiert Oracle implizit die SQL 99-Syntax in die entsprechende Oracle-spezifische Syntax. Natürlich gibt es Fehler in der gesamten Software, daher ist es möglich, dass der eine oder andere aufgrund eines Fehlers anders funktioniert. Je jünger die Version von Oracle ist, desto unwahrscheinlicher ist es, dass Sie einen Unterschied sehen.

Der (+) -Operator (und eine Reihe anderer Outer-Join-Operatoren in anderen Datenbanken) wurde erstellt, weil der SQL-Standard bis zum SQL-99-Standard keine standardmäßige Art hatte, einen Outer-Join auszudrücken. Zuvor hat jeder Anbieter eigene Erweiterungen angelegt. Oracle brauchte einige Jahre, um die neue Syntax zu unterstützen. Zwischen der Tatsache, dass in den ersten Releases der SQL-99-Unterstützung häufiger Fehler auftraten (nicht üblich, aber häufiger als jetzt), war die Tatsache, dass Produkte weiterhin ältere Datenbankversionen unterstützen mussten, die die neue Syntax nicht unterstützten, und Da die Leute im Allgemeinen mit der alten Syntax zufrieden sind, wird heute noch viel Code geschrieben, der die alte Oracle-Syntax verwendet.

    
Justin Cave 25.11.2013 07:54
quelle
0

A1:

Soweit ich weiß, unterscheiden sie sich hinsichtlich der Syntax nicht in der Leistung. Es gibt also keinen Unterschied zwischen dem Beitritt bei 'where' und dem Beitritt bei 'from'.

A2:

Um dies besser zu beantworten, ist die "Joining at FROM" -Klausel auf allen Plattformen Standard. Also vergiss (+) Symbole

A3 Ich habe manchmal in Oracle gearbeitet. Leute benutzen (+) Symbole für Links / Rechts-Joins, weil es einfach zu schreiben ist. Einige ppl verwenden Join bei (FROM) -Klausel, weil es besser lesbar und verständlich ist.

Hoffe, diese Punkte helfen dir. Bitte lassen Sie mich wissen, wenn etwas falsch ist.

    
Mari 25.11.2013 07:51
quelle
0

Ein Unterschied zwischen Oracle-Syntax und ANSI-Syntax ist: In der Oracle-Syntax können Sie keinen FULL OUTER JOIN erstellen, da Sie die ANSI-Syntax verwenden müssen.

Oracle hat die ANSI-Syntax in Oracle 9i eingeführt - einschließlich einiger Bugs. In der Zwischenzeit funktioniert es seit Oracle 11 oder 12 recht gut, aber Sie können in Oracle 9/10 einige Hindernisse entdecken.

Ein weiterer Vorteil der ANSI-Join-Syntax besteht darin, dass Sie keine Join-Bedingung vergessen können.

"SELECT * FROM TABLE_A, TABLE_B" führt implizit einen Cross-Join durch. "SELECT * FROM TABLE_A JOIN TABLE_B" löst einen Fehler aus, Sie müssen die Join-Bedingung angeben. Wenn Sie eine Verknüpfung erstellen möchten, müssen Sie sie angeben, z. B. "SELECT * FROM TABLE_A CROSS JOIN TABLE_B"

    
Wernfried Domscheit 27.11.2013 06:50
quelle