sql >> Base de Datos >  >> RDS >> Oracle

¿Existe una recomendación oficial de Oracle sobre el uso de ANSI JOIN explícito frente a uniones implícitas?

Hay una serie de notas del sitio de soporte de Oracle sobre problemas con la sintaxis de combinación ANSI con soluciones alternativas que recomiendan usar la sintaxis de Oracle.

Error 5188321 resultados incorrectos (sin filas) O ORA-1445 de unión externa 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.

Error 5368296 ANSI join SQL puede no informar ORA-918 para columna 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;

Error 7670135 Tiempo de análisis largo al compilar unión 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

De Oracle Press - Oracle OCP 11g guía de examen todo en uno

Y de asktom (que no se compromete)

 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. 

Consulte también la pregunta anterior sobre el mismo tema ¿Diferencia entre la notación más (+) de Oracle y la notación ansi JOIN?

También encontré esta declaración en un documento pero no hay referencia de dónde proviene

"A partir de Oracle 9i, Oracle recomienda que los desarrolladores de SQL utilicen la sintaxis de combinación ANSI en lugar de la sintaxis (+) propietaria de Oracle. Hay varias razones para esta recomendación, que incluyen:

• Más fácil de segregar y leer (sin mezclar combinación con código de restricción) • Más fácil de construir código de combinación correctamente (especialmente en el caso de combinaciones “externas”) • La sintaxis portátil funcionará en todas las demás bases de datos compatibles con ANSI, como MS SQL Server , DB2, MySQL, PostgreSQL, et al• Dado que es el estándar universalmente aceptado, es el objetivo general de todas las herramientas futuras de proveedores de bases de datos y de terceros• La sintaxis de unión externa (+) patentada de Oracle solo se puede usar en una dirección en vez, no puede realizar una combinación externa completa. Además de estas limitaciones adicionales de la documentación de Oracle:o El operador (+) se puede aplicar solo a una columna, no a una expresión arbitraria. Sin embargo, una expresión arbitraria puede contener una o más columnas marcadas con el operador (+).o Una condición que contiene el operador (+) no se puede combinar con otra condición usando el operador lógico OR.o Una condición no puede usar la condición de comparación IN para compare una columna marcada con el operador (+) con una expresión.o Una condición no puede comparar ninguna columna marcada con el operador (+) con una subconsulta".

Por lo tanto, es hora de adoptar la sintaxis de combinación ANSI y pasar al siglo XXI