Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Unterschied zwischen der Plus (+)-Notation von Oracle und der Ansi JOIN-Notation?

AFAIK, der (+) Notation ist nur aus Gründen der Abwärtskompatibilität vorhanden, da Oracle sie eingeführt hat, bevor der ANSI-Standard für Joins eingeführt wurde. Es ist spezifisch für Oracle und Sie sollten es vermeiden, es in neuem Code zu verwenden, wenn eine gleichwertige standardkonforme Version verfügbar ist.

Es scheint, dass es Unterschiede zwischen den beiden und dem (+) gibt Notation hat Einschränkungen, die die ANSI-Join-Syntax nicht hat. Oracle selbst empfiehlt, den (+) nicht zu verwenden Notation. Vollständige Beschreibung hier in der Oracle® Database SQL Language Reference11g Release 1 (11.1):

Oracle empfiehlt die Verwendung von FROM Klausel OUTER JOIN Syntax anstelle des Oracle-Join-Operators. Outer-Join-Abfragen, die den Oracle-Join-Operator (+) verwenden unterliegen den folgenden Regeln und Einschränkungen, die nicht für FROM gelten Klausel OUTER JOIN Syntax:

  • Sie können den (+) nicht angeben Operator in einem Abfrageblock, der auch FROM enthält Klausel-Join-Syntax.
  • Der (+) Der Operator kann nur im WHERE erscheinen -Klausel oder im Kontext der Linkskorrelation (bei Angabe der TABLE -Klausel) in FROM -Klausel und kann nur auf eine Spalte einer Tabelle oder Ansicht angewendet werden.
  • Wenn A und B durch mehrere Join-Bedingungen verbunden sind, müssen Sie den (+) verwenden Bediener unter all diesen Bedingungen. Wenn Sie dies nicht tun, gibt Oracle Database nur die Zeilen zurück, die aus einem einfachen Join resultieren, jedoch ohne Warnung oder Fehler, um Sie darauf hinzuweisen, dass Sie nicht über die Ergebnisse eines Outer Join verfügen.
  • Der (+) -Operator erzeugt keinen äußeren Join, wenn Sie eine Tabelle in der äußeren Abfrage und die andere Tabelle in einer inneren Abfrage angeben.
  • Sie können den (+) nicht verwenden Operator zum Outer-Join einer Tabelle mit sich selbst, obwohl Self-Joins gültig sind.

Die folgende Anweisung ist beispielsweise nicht gültig:

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

Der folgende Selbstbeitritt ist jedoch gültig:

SELECT e1.employee_id, e1.manager_id, e2.employee_id
FROM employees e1, employees e2
WHERE e1.manager_id(+) = e2.employee_id;
  • Der (+) -Operator kann nur auf eine Spalte angewendet werden, nicht auf einen beliebigen Ausdruck. Ein beliebiger Ausdruck kann jedoch eine oder mehrere Spalten enthalten, die mit (+) gekennzeichnet sind Betreiber.
  • Ein WHERE Bedingung, die den (+) enthält Der Operator kann nicht mit einer anderen Bedingung mit OR kombiniert werden logischer Operator.
  • Ein WHERE Bedingung kann IN nicht verwenden Vergleichsbedingung, um eine mit (+) markierte Spalte zu vergleichen Operator mit einem Ausdruck.

Wenn der WHERE -Klausel enthält eine Bedingung, die eine Spalte aus Tabelle B mit einer Konstanten vergleicht, dann den (+) Operator auf die Spalte angewendet werden, damit Oracle die Zeilen aus Tabelle A zurückgibt, für die es Nullen für diese Spalte generiert hat. Andernfalls gibt Oracle nur die Ergebnisse eines einfachen Joins zurück.

In einer Abfrage, die äußere Verknüpfungen von mehr als zwei Tabellenpaaren durchführt, kann eine einzelne Tabelle die nullgenerierte Tabelle für nur eine andere Tabelle sein. Aus diesem Grund können Sie den (+) nicht anwenden Operator zu Spalten von B in der Join-Bedingung für A und B und der Join-Bedingung für B und C. Siehe SELECT für die Syntax für einen äußeren Join.