sql >> Databasteknik >  >> RDS >> Oracle

Finns det en officiell rekommendation från Oracle om användningen av explicita ANSI JOINs kontra implicita joins?

Det finns ett antal anteckningar från Oracles supportwebbplats om problem med ANSI-anslutningssyntax med lösningar som rekommenderar att du använder Oracle-syntaxen.

Bug 5188321 fel resultat (inga rader) ELLER ORA-1445 från ANSI yttre koppling

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 kanske inte rapporterar ORA-918 för tvetydig kolumn

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 Lång analystid vid kompilering av ANSI-anslutning

 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

Från Oracle Press - Oracle OCP 11g allt i en examensguide

Och från asktom (som är icke-bindande)

 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. 

Se även tidigare fråga om samma ämne. Skillnaden mellan Oracles plus (+) notation och ansi JOIN notation?

Jag hittade också detta uttalande i ett dokument men ingen hänvisning till varifrån det kom

"Från och med Oracle 9i rekommenderar Oracle att SQL-utvecklare använder ANSI join-syntaxen istället för Oracles proprietära (+) syntax. Det finns flera anledningar till denna rekommendation, inklusive:

• Lättare att separera och läsa (utan att blanda ihop join kontra restriktionskod) • Lättare att konstruera joinkod korrekt (särskilt i fallet med "outer" joins) • Bärbar syntax fungerar på alla andra ANSI-kompatibla databaser, som MS SQL Server , DB2, MySQL, PostgreSQL, et al• Eftersom det är den universellt accepterade standarden är det det allmänna målet för alla framtida databas- och tredjepartsleverantörers verktyg• Den egenutvecklade Oracle-syntaxen för yttre koppling (+) kan endast användas i en riktning på en gång kan den inte utföra en fullständig yttre sammanfogning• Plus dessa ytterligare begränsningar från Oracle-dokumentationen:o Operatorn (+) kan endast tillämpas på en kolumn, inte på ett godtyckligt uttryck. Ett godtyckligt uttryck kan dock innehålla en eller flera kolumner markerade med operatorn (+).o Ett villkor som innehåller operatorn (+) kan inte kombineras med ett annat villkor med den logiska operatorn OR.o Ett villkor kan inte använda jämförelsevillkoret IN för att jämför en kolumn markerad med (+)-operatorn med ett uttryck.o Ett villkor kan inte jämföra någon kolumn markerad med (+)-operatorn med en underfråga."

Därför är det dags att anamma ANSI-joinsyntaxen – och gå in i 2000-talet



  1. Var kan man ändra värdet på small_case_table_names=2 i Windows xampp

  2. Installera och arbeta med MySQL 5 på Windows 7

  3. Flytta data från SQL Server till Oracle upprepade gånger

  4. SYS_EXTRACT_UTC() Funktion i Oracle