sql >> Database >  >> RDS >> Oracle

Is er een officiële Oracle-aanbeveling over het gebruik van expliciete ANSI JOIN's versus impliciete joins?

Er zijn een aantal opmerkingen van de Oracle Support-site over problemen met de ANSI-joinsyntaxis met tijdelijke oplossingen die worden aanbevolen om de orakelsyntaxis te gebruiken.

Bug 5188321 verkeerde resultaten (geen rijen) OF ORA-1445 van 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.

Bug 5368296 ANSI join SQL rapporteert mogelijk geen ORA-918 voor dubbelzinnige kolom

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 Lange ontledingstijd bij het compileren van ANSI-deelname

 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

Van de Oracle Press - Oracle OCP 11g alles-in-één examengids

En van asktom (die vrijblijvend is)

 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. 

Zie ook eerdere vraag over hetzelfde onderwerp. Verschil tussen de plus (+)-notatie van Oracle en de ansi JOIN-notatie?

Ik vond deze verklaring ook in een document, maar geen verwijzing naar waar deze vandaan kwam

"Vanaf Oracle 9i raadt Oracle aan dat SQL-ontwikkelaars de ANSI-joinsyntaxis gebruiken in plaats van de Oracle-eigen (+) syntaxis. Er zijn verschillende redenen voor deze aanbeveling, waaronder:

• Gemakkelijker te scheiden en te lezen (zonder join- en restrictiecode door elkaar te halen) • Gemakkelijker om join-code correct te construeren (vooral in het geval van "outer" joins) • Draagbare syntaxis werkt op alle andere ANSI-compatibele databases, zoals MS SQL Server , DB2, MySQL, PostgreSQL, et al.• Aangezien het de universeel aanvaarde standaard is, is het het algemene doelwit voor alle toekomstige tools van databases en externe leveranciers• De gepatenteerde Oracle outer-join (+) syntaxis kan slechts in één richting worden gebruikt op een keer kan het geen volledige outer join uitvoeren • Plus deze aanvullende beperkingen uit de Oracle-documentatie:o De (+) operator kan alleen worden toegepast op een kolom, niet op een willekeurige expressie. Een willekeurige uitdrukking kan echter een of meer kolommen bevatten die zijn gemarkeerd met de (+)-operator.o Een voorwaarde die de (+)-operator bevat, kan niet worden gecombineerd met een andere voorwaarde met behulp van de logische OR-operator. vergelijk een kolom gemarkeerd met de (+) operator met een expressie.o Een voorwaarde kan geen enkele kolom gemarkeerd met de (+) operator vergelijken met een subquery."

Het is dus tijd om de syntaxis van de ANSI-joint te omarmen - en de 21e eeuw in te gaan



  1. Scheidingsteken voor duizendtallen in SQL Server 2008 voor een kolom

  2. mysql - een mechanisme maken dat lijkt op de reeksen van Oracle

  3. Hoe kan ik een lijst maken met dezelfde ID-gegevens met while-lus in PHP?

  4. Missiekritieke toegangstoepassingen identificeren en beheren tijdens een ontwikkelingsproject