AFAIK, de (+)
notatie is alleen aanwezig voor achterwaartse compatibiliteit omdat Oracle het debuteerde voordat de ANSI-standaard voor joins werd ingevoerd. Het is specifiek voor Oracle en u moet het niet gebruiken in nieuwe code als er een equivalente versie beschikbaar is die voldoet aan de normen.
Het lijkt erop dat er verschillen zijn tussen de twee, en de (+)
notatie heeft beperkingen die de ANSI-joinsyntaxis niet heeft. Oracle raadt zelf aan om de (+)
. niet te gebruiken notatie.Volledige beschrijving hier in de Oracle® Database SQL Language Reference11g Release 1 (11.1):
Oracle raadt u aan de FROM
. te gebruiken clausule OUTER JOIN
syntaxis in plaats van de Oracle join-operator. Outer join-query's die gebruikmaken van de Oracle join-operator (+)
zijn onderworpen aan de volgende regels en beperkingen, die niet van toepassing zijn op de FROM
clausule OUTER JOIN
syntaxis:
- U kunt de
(+)
. niet specificeren operator in een queryblok dat ookFROM
. bevat clausule join syntaxis. - De
(+)
operator kan alleen verschijnen in deWHERE
clausule of, in de context van links-correlatie (bij het specificeren van deTABLE
clausule) in deFROM
clausule, en kan alleen worden toegepast op een kolom van een tabel of weergave. - Als A en B worden samengevoegd door meerdere samenvoegvoorwaarden, moet u de
(+)
gebruiken exploitant in al deze voorwaarden. Als u dat niet doet, retourneert Oracle Database alleen de rijen die het resultaat zijn van een eenvoudige join, maar zonder waarschuwing of fout om u te informeren dat u niet de resultaten van een outer join hebt. - De
(+)
operator produceert geen outer join als u één tabel opgeeft in de outer query en de andere tabel in een inner query. - U kunt de
(+)
. niet gebruiken operator om een tabel naar zichzelf toe te voegen, hoewel zelf-joins geldig zijn.
De volgende verklaring is bijvoorbeeld niet geldig:
SELECT employee_id, manager_id
FROM employees
WHERE employees.manager_id(+) = employees.employee_id;
De volgende self-join is echter geldig:
SELECT e1.employee_id, e1.manager_id, e2.employee_id
FROM employees e1, employees e2
WHERE e1.manager_id(+) = e2.employee_id;
- De
(+)
operator kan alleen worden toegepast op een kolom, niet op een willekeurige uitdrukking. Een willekeurige uitdrukking kan echter een of meer kolommen bevatten die zijn gemarkeerd met de(+)
operator. - Een
WHERE
voorwaarde die de(+)
. bevat operator kan niet worden gecombineerd met een andere voorwaarde met behulp van deOR
logische operator. - Een
WHERE
voorwaarde kan deIN
niet gebruiken vergelijkingsvoorwaarde om een kolom te vergelijken die is gemarkeerd met de(+)
operator met een uitdrukking.
Als de WHERE
clausule bevat een voorwaarde die een kolom uit tabel B vergelijkt met een constante, dan de (+)
operator moet worden toegepast op de kolom zodat Oracle de rijen uit tabel A retourneert waarvoor het nulls voor deze kolom heeft gegenereerd. Anders retourneert Oracle alleen de resultaten van een eenvoudige join.
In een query die outer joins van meer dan twee paar tabellen uitvoert, kan een enkele tabel de null-gegenereerde tabel zijn voor slechts één andere tabel. Om deze reden kunt u de (+)
. niet toepassen operator naar kolommen van B in de join-voorwaarde voor A en B en de join-voorwaarde voor B en C. Raadpleeg SELECT
voor de syntaxis voor een outer join.