Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Existe uma recomendação oficial da Oracle sobre o uso de ANSI JOINs explícitos versus junções implícitas?


Há várias notas do site de suporte da Oracle sobre problemas com a sintaxe de junção ANSI com soluções alternativas que recomendam o uso da sintaxe oracle.

Bug 5188321 resultados incorretos (sem linhas) OU ORA-1445 da junção 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.

Bug 5368296 ANSI join SQL pode não relatar ORA-918 para coluna ambígua
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 Longo tempo de análise compilando junção 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

Do Oracle Press - Oracle OCP 11g guia de exame tudo em um



E do asktom (que não é 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. 

Veja também a pergunta anterior no mesmo tópico Diferença entre a notação mais (+) do Oracle e a notação ansi JOIN?

Eu também encontrei esta declaração em um documento, mas nenhuma referência de onde ela veio

"A partir do Oracle 9i, a Oracle recomenda que os desenvolvedores de SQL usem a sintaxe de junção ANSI em vez da sintaxe proprietária (+) da Oracle. Há vários motivos para essa recomendação, incluindo:

• Mais fácil de segregar e ler (sem misturar código de junção versus código de restrição) • Mais fácil de construir o código de junção corretamente (especialmente no caso de junções “externas”) • A sintaxe portátil funcionará em todos os outros bancos de dados compatíveis com ANSI, como MS SQL Server , DB2, MySQL, PostgreSQL, et al• Como é o padrão universalmente aceito, é o alvo geral para todas as ferramentas de banco de dados futuros e fornecedores de terceiros• A sintaxe proprietária de junção externa (+) do Oracle só pode ser usada em uma direção em uma vez, ele não pode executar uma junção externa completa• Além dessas limitações adicionais da documentação do Oracle:o O operador (+) pode ser aplicado apenas a uma coluna, não a uma expressão arbitrária. No entanto, uma expressão arbitrária pode conter uma ou mais colunas marcadas com o operador (+).o Uma condição contendo o operador (+) não pode ser combinada com outra condição usando o operador lógico OR.o Uma condição não pode usar a condição de comparação IN para compare uma coluna marcada com o operador (+) com uma expressão.o Uma condição não pode comparar nenhuma coluna marcada com o operador (+) com uma subconsulta."

Portanto, é hora de adotar a sintaxe de junção ANSI - e entrar no século 21