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å indeholderFROM
klausul joinsyntaks. (+) operator kan kun vises i WHERE
klausul eller, i sammenhæng med venstre-korrelation (når du angiverTABEL
klausul) iFROM
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 afELLER
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.