varias techonthenet tablas plus left inner all oracle join

techonthenet - ¿Hay alguna recomendación oficial de Oracle sobre el uso de ANSI JOIN explícitas frente a combinaciones implícitas?



oracle join vs inner join (2)

Nota: No le pido que me diga "utilizar uniones explícitas" sino que busque la posición oficial de Oracle, si corresponde, sobre ese tema.

De la documentación de la base de datos Oracle (también aparece en las documentaciones 9i y 11g):

Oracle recomienda que utilice la sintaxis OUTER JOIN cláusula FROM lugar del operador de unión de Oracle. Las consultas de unión externa que utilizan el operador de combinación Oracle (+) están sujetas a las siguientes reglas y restricciones [...]

En otras palabras, Oracle aconseja preferir la primera de estas dos formas:

FROM a LEFT JOIN b ON b.x = a.x vs FROM a, b WHERE b.x(+) = a.x

Sin embargo, nunca he encontrado en ninguna documentación de Oracle una sola recomendación para utilizar preferiblemente una de esas dos formas:

FROM a INNER JOIN b ON b.x = a.x vs FROM a, b WHERE b.x = a.x

¿Hay algún párrafo que haya olvidado?


No lo he visto si lo hay. La razón para preferir la sintaxis ANSI para combinaciones externas en particular (aparte del símbolo no estándar, específico de Oracle (+) ) es que se pueden expresar más combinaciones externas usando la sintaxis ANSI. La restricción "ORA-01417: una tabla puede unirse externamente a como máximo otra tabla" se aplica a las uniones externas (+) pero no a las uniones externas de ANSI. Otras restricciones en (+) que no se aplican a las uniones externas de ANSI están documentadas aquí .

Un experto en Oracle muy respetado realmente recomienda apegarse a la vieja sintaxis para las uniones internas: ver el blog de Jonathan Lewis . Él dice que las uniones ANSI se transforman a las uniones Oracle tradicionales bajo las cubiertas de todos modos. No estoy de acuerdo con él al 100% (prefiero que ANSI se una conmigo en general), pero no afirmaría tener una fracción de su conocimiento sobre el tema.

En pocas palabras, las uniones externas ANSI son técnicamente superiores a las uniones antiguas (+) , mientras que con las uniones internas es más una cuestión de estilo.


Hay varias notas del sitio de soporte de Oracle sobre problemas con la sintaxis de las uniones ANSI con soluciones alternativas que recomiendan utilizar la sintaxis de Oracle.

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

Error 5368296 ANSI join SQL no puede 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 compilando 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

Desde Oracle Press - Oracle OCP 11g guía de exámenes todo en uno

Y de asktom (que no está comprometido)

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.

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

También encontré esta declaración en un documento, pero no se hizo referencia a su origen

"Comenzando con Oracle 9i, Oracle recomienda que los desarrolladores de SQL utilicen la sintaxis de unión ANSI en lugar de la sintaxis patentada de Oracle (+). Existen varias razones para esta recomendación, que incluyen:

• Más fácil segregar y leer (sin mezclar código de combinación versus restricción) • Más fácil construir código de combinación correctamente (especialmente en el caso de uniones "externas") • La sintaxis portátil funcionará en todas las demás bases de datos ANSI, como MS SQL Server , DB2, MySQL, PostgreSQL, et al • Dado que es el estándar universalmente aceptado, es el objetivo general para todas las herramientas futuras de base de datos y proveedores externos. • La sintaxis de Oracle outer-join (+) exclusiva solo se puede usar en una dirección en una vez, no puede realizar una combinación externa completa • Además de estas limitaciones adicionales de la documentación de Oracle: o El operador (+) solo se puede aplicar 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 utilizando el operador lógico OR. o Una condición no puede usar la condición de comparación IN para comparar 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 sub consulta ".

Por lo tanto, es hora de adoptar la sintaxis de unión de ANSI y avanzar hacia el siglo XXI