Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Gibt es eine offizielle Oracle-Empfehlung zur Verwendung von expliziten ANSI-JOINs im Vergleich zu impliziten Joins?

Auf der Oracle Support-Website gibt es eine Reihe von Hinweisen zu Problemen mit der ANSI-Join-Syntax mit Problemumgehungen, in denen die Verwendung der Oracle-Syntax empfohlen wird.

Bug 5188321 falsche Ergebnisse (keine Zeilen) ODER ORA-1445 von ANSI Outer Join

Versions affected: Versions >= 9.2.0.1 but < 11 

Description
Wrong results or an ORA-1445 can be returned with a query involving a 
 very large select list count when ANSI OUTER JOIN syntax is used.


Workaround
  Use native oracle outer join syntax 
 or 
  reduce the select list count.

Bug 5368296 ANSI Join SQL meldet ORA-918 möglicherweise nicht für mehrdeutige Spalten

Versions affected: Versions < 11

Description

****
Note: This fix introduces the problem described in bug 7318276
      One off fixes for that bug address the issue here also.
****      

ORA-918 is not reported for an ambiguous column in a query 
involving an ANSI join of more than 2 tables/objects. 

eg:
 -- 2 table join, returns ORA-918
 SELECT  empno 
 FROM emp a JOIN emp b  on a.empno = b.empno; 

 -- 3 table join does not report ORA-918 when it should ...
 SELECT  empno
 FROM emp a JOIN emp b on a.empno = b.empno
            JOIN emp c on a.empno = c.empno;

Bug 7670135 Lange Analysezeit beim Kompilieren von ANSI-Joins

 Versions affected: Versions BELOW 11.2 

Description

A query having ANSI join(s) may take noticeable time during query compilation,
especially if the query includes an NVL() function.

Workaround:
 Use ORACLE join instead of ANSI join

Von Oracle Press – Oracle OCP 11g all in one Exam Guide

Und von asktom (der unverbindlich ist)

 Historically there have been bugs related to ANSI syntax, in fact even the 
 10.2.0.4 projected issues list includes 10 bugs/issues related to ANSI syntax.

 In the past I've encountered some of these bugs myself, and have continued to use 
 and advocate the "traditional" Oracle style.

 I'd like to know if you feel that the implementation of ANSI syntax is now equally    
 robust compared  to the traditional syntax.

 Followup   February 19, 2008 - 5pm Central time zone:
 unfortunately, there are bugs in non-ansi joins too, probably more than 10 in fact.

 I personally do not use the new syntax (except in the rare case of a full outer join, 
 a truly rare beast to encounter). I have no comment on it really. 

Siehe auch frühere Frage zum gleichen Thema. Unterschied zwischen der Plus (+)-Notation von Oracle und der ANSI-JOIN-Notation?

Ich habe diese Aussage auch in einem Dokument gefunden, aber keinen Hinweis darauf, woher sie stammt

„Ab Oracle 9i empfiehlt Oracle SQL-Entwicklern, die ANSI-Join-Syntax anstelle der proprietären (+) Syntax von Oracle zu verwenden. Es gibt mehrere Gründe für diese Empfehlung, darunter:

• Einfacher zu trennen und zu lesen (ohne Verknüpfungs- und Beschränkungscode zu verwechseln) • Einfacher korrekter Verknüpfungscode zu erstellen (insbesondere im Fall von „äußeren“ Verknüpfungen) • Portable Syntax funktioniert auf allen anderen ANSI-kompatiblen Datenbanken, wie z. B. MS SQL Server , DB2, MySQL, PostgreSQL usw. • Da es sich um den allgemein akzeptierten Standard handelt, ist es das allgemeine Ziel für alle zukünftigen Tools von Datenbanken und Drittanbietern Hin und wieder kann er keinen vollständigen Outer-Join ausführen• Außerdem diese zusätzlichen Einschränkungen aus der Oracle-Dokumentation:o Der (+)-Operator kann nur auf eine Spalte angewendet werden, nicht auf einen beliebigen Ausdruck. Ein beliebiger Ausdruck kann jedoch eine oder mehrere Spalten enthalten, die mit dem (+)-Operator markiert sind.o Eine Bedingung, die den (+)-Operator enthält, kann nicht mit einer anderen Bedingung mit dem logischen OR-Operator kombiniert werden.o Eine Bedingung kann die IN-Vergleichsbedingung nicht verwenden eine mit dem (+)-Operator markierte Spalte mit einem Ausdruck vergleichen.o Eine Bedingung kann keine mit dem (+)-Operator markierte Spalte mit einer Unterabfrage vergleichen."

Daher ist es an der Zeit, die ANSI-Join-Syntax anzunehmen – und sich ins 21. Jahrhundert zu bewegen