Oracle
 sql >> Base de données >  >> RDS >> Oracle

Existe-t-il une recommandation officielle d'Oracle sur l'utilisation des jointures ANSI explicites par rapport aux jointures implicites ?

Il existe un certain nombre de notes du site de support Oracle sur les problèmes liés à la syntaxe de jointure ANSI avec des solutions de contournement recommandant d'utiliser la syntaxe oracle.

Bogue 5188321 résultats erronés (pas de lignes) OU ORA-1445 de la jointure externe ANSI

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 peut ne pas signaler ORA-918 pour une colonne ambiguë

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;

Bogue 7670135 Temps d'analyse long lors de la compilation de la jointure 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

Tiré d'Oracle Press - Guide d'examen tout-en-un Oracle OCP 11g

Et de asktom (qui ne s'engage pas)

 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. 

Voir aussi la question précédente sur le même sujetDifférence entre la notation plus (+) d'Oracle et la notation ansi JOIN ?

J'ai également trouvé cette déclaration dans un document mais aucune référence quant à son origine

"À partir d'Oracle 9i, Oracle recommande aux développeurs SQL d'utiliser la syntaxe de jointure ANSI au lieu de la syntaxe propriétaire (+) d'Oracle. Il existe plusieurs raisons à cette recommandation, notamment :

• Plus facile à séparer et à lire (sans confondre jointure et code de restriction) • Plus facile à construire correctement le code de jointure (en particulier dans le cas de jointures "externes") • La syntaxe portable fonctionnera sur toutes les autres bases de données conformes à l'ANSI, telles que MS SQL Server , DB2, MySQL, PostgreSQL, et al• Puisqu'il s'agit de la norme universellement acceptée, c'est la cible générale de tous les futurs outils de bases de données et de fournisseurs tiers• La syntaxe propriétaire Oracle de jointure externe (+) ne peut être utilisée que dans un sens à une fois, il ne peut pas effectuer une jointure externe complète • Plus ces limitations supplémentaires de la documentation Oracle :o L'opérateur (+) ne peut être appliqué qu'à une colonne, pas à une expression arbitraire. Cependant, une expression arbitraire peut contenir une ou plusieurs colonnes marquées par l'opérateur (+).o Une condition contenant l'opérateur (+) ne peut pas être combinée avec une autre condition à l'aide de l'opérateur logique OR.o Une condition ne peut pas utiliser la condition de comparaison IN pour comparer une colonne marquée avec l'opérateur (+) avec une expression.o Une condition ne peut pas comparer une colonne marquée avec l'opérateur (+) avec une sous-requête."

Il est donc temps d'adopter la syntaxe de jointure ANSI - et de passer au 21e siècle