Na webu podpory Oracle je řada poznámek o problémech se syntaxí spojení ANSI s náhradními řešeními, která doporučují používat syntaxi Oracle.
Chyba 5188321 nesprávné výsledky (žádné řádky) NEBO ORA-1445 z vnějšího spojení 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.
Chyba 5368296 SQL join ANSI nemusí hlásit ORA-918 pro nejednoznačný sloupec
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;
Chyba 7670135 Dlouhá doba analýzy kompilace připojení 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
Od společnosti Oracle Press - Oracle OCP 11g vše v jednom průvodci zkouškami
A od asktoma (který je nezávazný)
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.
Viz také dřívější otázka na stejné téma Rozdíl mezi notací Oracle plus (+) a notací ansi JOIN?
Toto prohlášení jsem také našel v dokumentu, ale bez odkazu na to, odkud pochází
"Počínaje Oracle 9i společnost Oracle doporučuje, aby vývojáři SQL používali syntaxi spojení ANSI namísto proprietární (+) syntaxe Oracle. Existuje několik důvodů pro toto doporučení, včetně:
• Snazší segregace a čtení (bez zaměňování kódu spojení a omezení)• Snazší vytvoření správného kódu spojení (zejména v případě „vnějších“ spojení)• Přenosná syntaxe bude fungovat na všech ostatních databázích vyhovujících ANSI, jako je MS SQL Server , DB2, MySQL, PostgreSQL a další• Vzhledem k tomu, že se jedná o všeobecně přijímaný standard, je obecným cílem všech budoucích databázových nástrojů a nástrojů třetích stran• Vlastní syntaxi Oracle external-join (+) lze použít pouze jedním směrem na v jednu chvíli nemůže provést úplné vnější spojení• Plus tato další omezení z dokumentace Oracle:o Operátor (+) lze použít pouze na sloupec, nikoli na libovolný výraz. Libovolný výraz však může obsahovat jeden nebo více sloupců označených operátorem (+).o Podmínku obsahující operátor (+) nelze kombinovat s jinou podmínkou pomocí logického operátoru OR.o Podmínku nelze použít k porovnávání IN. porovnejte sloupec označený operátorem (+) s výrazem.o Podmínka nemůže porovnat žádný sloupec označený operátorem (+) s dílčím dotazem."
Je tedy čas přijmout syntaxi spojení ANSI – a přejít do 21. století