sql >> Database teknologi >  >> RDS >> Oracle

Forskellen mellem Oracles plus (+) notation og ansi JOIN notation?

AFAIK, (+) notation er kun til stede for bagudkompatibilitet, fordi Oracle debuterede det, før ANSI-standarden for joins blev indført. Det er specifikt for Oracle, og du bør undgå at bruge det i ny kode, når der er en tilsvarende standard-kompatibel version tilgængelig.

Det ser ud til, at der er forskelle mellem de to og (+) notation har begrænsninger, som ANSI join-syntaksen ikke har. Oracle anbefaler selv, at du ikke bruger (+) notation.Fuld beskrivelse her i Oracle® Database SQL Language Reference11g Release 1 (11.1):

Oracle anbefaler, at du bruger FROM klausul OUTER JOIN syntaks i stedet for Oracle join-operatøren. Outer join-forespørgsler, der bruger Oracle join-operatoren (+) er underlagt følgende regler og begrænsninger, som ikke gælder for FROM klausul OUTER JOIN syntaks:

  • Du kan ikke angive (+) operator i en forespørgselsblok, der også indeholder FROM klausul joinsyntaks.
  • (+) operator kan kun vises i WHERE klausul eller, i sammenhæng med venstre-korrelation (når du angiver TABEL klausul) i FROM klausul, og kan kun anvendes på en kolonne i en tabel eller visning.
  • Hvis A og B er forbundet med flere sammenføjningsbetingelser, skal du bruge (+) operatør under alle disse forhold. Hvis du ikke gør det, returnerer Oracle Database kun de rækker, der er et resultat af en simpel joinforbindelse, men uden en advarsel eller fejl for at informere dig om, at du ikke har resultaterne af en ydre joinforbindelse.
  • (+) operatoren producerer ikke en ydre joinforbindelse, hvis du angiver en tabel i den ydre forespørgsel og den anden tabel i en indre forespørgsel.
  • Du kan ikke bruge (+) operator til at outer-join en tabel til sig selv, selv om selv joins er gyldige.

For eksempel er følgende sætning ikke gyldig:

SELECT employee_id, manager_id
FROM employees
WHERE employees.manager_id(+) = employees.employee_id;

Følgende selvtilmelding er dog gyldig:

SELECT e1.employee_id, e1.manager_id, e2.employee_id
FROM employees e1, employees e2
WHERE e1.manager_id(+) = e2.employee_id;
  • (+) operator kan kun anvendes på en kolonne, ikke på et vilkårligt udtryk. Et vilkårligt udtryk kan dog indeholde en eller flere kolonner markeret med (+) operatør.
  • En Hvor betingelse, der indeholder (+) operator kan ikke kombineres med en anden betingelse ved hjælp af ELLER logisk operator.
  • En Hvor betingelse kan ikke bruge IN sammenligningsbetingelse for at sammenligne en kolonne markeret med (+) operator med et udtryk.

Hvis WHERE klausul indeholder en betingelse, der sammenligner en kolonne fra tabel B med en konstant, derefter (+) operator skal anvendes på kolonnen, så Oracle returnerer rækkerne fra tabel A, som det har genereret null for denne kolonne. Ellers returnerer Oracle kun resultaterne af en simpel joinforbindelse.

I en forespørgsel, der udfører ydre joinforbindelser af mere end to par tabeller, kan en enkelt tabel kun være den nul-genererede tabel for én anden tabel. Af denne grund kan du ikke anvende (+) operator til kolonner af B i sammenføjningsbetingelsen for A og B og sammenføjningsbetingelsen for B og C. Se SELECT for syntaksen for en ydre joinforbindelse.



  1. Sådan udføres og administreres MySQL-sikkerhedskopier til Oracle DBA'er

  2. SQL:Parse kommasepareret streng og brug som join

  3. Brug af COALESCE-funktionen til at lave værdier adskilt med kommaer

  4. Sådan rangeres rækker i en partition i SQL