sql >> Database >  >> RDS >> Oracle

Verschil tussen Oracle's plus (+) notatie en ansi JOIN notatie?

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 ook FROM . bevat clausule join syntaxis.
  • De (+) operator kan alleen verschijnen in de WHERE clausule of, in de context van links-correlatie (bij het specificeren van de TABLE clausule) in de FROM 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 de OR logische operator.
  • Een WHERE voorwaarde kan de IN 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.



  1. MySQL stoppen/starten met MySQL Workbench

  2. 10 MySQL-database-interviewvragen voor beginners en gevorderden

  3. Hoe MAKETIME() werkt in MariaDB

  4. 10 SP_EXECUTESQL Gotcha's om te vermijden voor een betere dynamische SQL