Oracle
 sql >> Database >  >> RDS >> Oracle

Esiste una raccomandazione ufficiale Oracle sull'uso di ANSI JOIN espliciti rispetto ai join impliciti?

Sono disponibili una serie di note dal sito di supporto Oracle sui problemi con la sintassi di join ANSI con soluzioni alternative che consigliano di utilizzare la sintassi di Oracle.

Bug 5188321 risultati errati (nessuna riga) OPPURE ORA-1445 da 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 potrebbe non segnalare ORA-918 per colonna ambigua

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 Tempo di analisi lungo durante la compilazione del join ANSI

 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

Da Oracle Press - Oracle OCP 11g tutto in una guida all'esame

E da asktom (che non è vincolante)

 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. 

Vedi anche la domanda precedente sullo stesso argomento. Differenza tra la notazione più (+) di Oracle e la notazione ansi JOIN?

Ho anche trovato questa dichiarazione in un documento ma nessun riferimento alla provenienza

"A partire da Oracle 9i, Oracle consiglia agli sviluppatori SQL di utilizzare la sintassi di join ANSI anziché la sintassi proprietaria Oracle (+). Esistono diversi motivi per questa raccomandazione, tra cui:

• Più facile da separare e leggere (senza confondere il codice di join con quello di restrizione)• Più facile costruire correttamente il codice di join (soprattutto nel caso di join "esterni")• La sintassi portatile funzionerà su tutti gli altri database conformi ad ANSI, come MS SQL Server , DB2, MySQL, PostgreSQL, et al• Poiché è lo standard universalmente accettato, è l'obiettivo generale di tutti i futuri database e strumenti di fornitori di terze parti• La sintassi proprietaria Oracle outer-join (+) può essere utilizzata solo in una direzione a una volta, non può eseguire un join esterno completo• Inoltre queste limitazioni aggiuntive dalla documentazione Oracle:o L'operatore (+) può essere applicato solo a una colonna, non a un'espressione arbitraria. Tuttavia, un'espressione arbitraria può contenere una o più colonne contrassegnate dall'operatore (+).o Una condizione contenente l'operatore (+) non può essere combinata con un'altra condizione utilizzando l'operatore logico OR.o Una condizione non può utilizzare la condizione di confronto IN per confronta una colonna contrassegnata con l'operatore (+) con un'espressione.o Una condizione non può confrontare nessuna colonna contrassegnata con l'operatore (+) con una sottoquery."

Quindi è tempo di abbracciare la sintassi di join ANSI e di entrare nel 21° secolo