web-dev-qa-db-de.com

Oracle "(+)" Operator

Ich überprüfe einige alte SQL-Anweisungen, um sie zu dokumentieren und wahrscheinlich zu verbessern.

Das DBMS ist Oracle

Ich habe eine Aussage, die so lautet, nicht verstanden:

select ...
from a,b
where a.id=b.id(+)

Ich bin verwirrt über den Operator (+) Und konnte ihn in keinem Forum finden ... (das Suchen nach + in Anführungszeichen funktionierte auch nicht).

Wie auch immer, ich habe 'Explain Plan' von SQLDeveloper verwendet und eine Ausgabe erhalten, die besagt, dass HASH JOIN, RIGHT OUTER Usw.

Würde es einen Unterschied geben, wenn ich den Operator (+) Am Ende der Abfrage entferne? Muss die Datenbank eine Bedingung erfüllen (wie z. B. einige Indizes usw.), bevor (+) Verwendet werden kann? Es wäre sehr hilfreich, wenn Sie mir ein einfaches Verständnis oder einige gute Links geben könnten, über die ich darüber lesen kann.

Vielen Dank!

145
Sekhar

Dies ist die Oracle-spezifische Notation für einen OUTER JOIN, da das ANSI-89-Format (das ein Komma in der FROM-Klausel zum Trennen von Tabellenreferenzen verwendet) keine OUTER-Joins standardisierte.

Die Abfrage würde in der ANSI-92-Syntax wie folgt umgeschrieben:

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id

Dieser Link ist ziemlich gut, um den Unterschied zwischen JOINs zu erklären .


Es sollte auch beachtet werden, dass, obwohl der (+) Funktioniert, Oracle empfiehlt , ihn nicht zu verwenden :

Oracle empfiehlt, die Syntax der FROM-Klausel OUTER JOIN Anstelle des Oracle-Join-Operators zu verwenden. Äußere Join-Abfragen, die den Oracle-Join-Operator (+) Verwenden, unterliegen den folgenden Regeln und Einschränkungen, die nicht für die Syntax der FROM-Klausel OUTER JOIN Gelten:

173
OMG Ponies

Der Operator (+) gibt eine äußere Verknüpfung an. Dies bedeutet, dass Oracle auch dann noch Datensätze von der anderen Seite des Joins zurückgibt, wenn keine Übereinstimmung vorliegt. Wenn zum Beispiel a und b Mitarbeiter und Abteilungen sind und Sie Mitarbeiter einer Abteilung nicht zuordnen können, gibt die folgende Anweisung Details aller Mitarbeiter zurück, unabhängig davon, ob sie einer Abteilung zugeordnet wurden oder nicht.

select * from emp, dept where emp.dept_id=dept.dept_id(+)

Kurz gesagt, das Entfernen des (+) kann einen signifikanten Unterschied bewirken, aber je nach Ihren Daten werden Sie es möglicherweise eine Weile nicht bemerken!

26
hot dog

In Oracle steht (+) für die "optionale" Tabelle im JOIN. Also in Ihrer Anfrage,

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)

es ist eine LINKE AUSSENVERBINDUNG von Tabelle 'b' zu Tabelle 'a'. Es werden alle Daten der Tabelle 'a' zurückgegeben, ohne dass die Daten verloren gehen, wenn die andere Seite (optionale Tabelle 'b') keine Daten enthält.

Diagram of Left Outer Join

Die moderne Standardsyntax für dieselbe Abfrage wäre

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id

oder mit einer Abkürzung für a.id=b.id (wird nicht von allen Datenbanken unterstützt):

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)

Wenn Sie (+) entfernen, handelt es sich um eine normale innere Verknüpfungsabfrage

Ältere Syntax in Oracle und anderen Datenbanken:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id

Modernere Syntax:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id

Oder einfach:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id

Diagram of Inner Join

Es werden nur alle Daten zurückgegeben, bei denen beide 'a'- und' b'-Tabellen 'id'-Werte gleich sind, bedeutet gemeinsamer Teil.

Wenn Sie aus Ihrer Abfrage einen Right Join machen möchten

Dies ist genauso wie bei einem LEFT JOIN, es wird jedoch gewechselt, welche Tabelle optional ist.

Diagram of Right Outer Join

Alte Oracle-Syntax:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id

Moderne Standardsyntax:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
RIGHT JOIN b ON a.id=b.id

Ref & Hilfe:

https://asktom.Oracle.com/pls/asktom/f?p=100:11::::P11_QUESTION_ID:6585774577187

Left Outer Join mit + in Oracle 11g

https://www.w3schools.com/sql/sql_join_left.asp

In der Praxis wird das Symbol + direkt in der bedingten Anweisung und auf der Seite der optionalen Tabelle platziert (die, die leere oder Nullwerte innerhalb der bedingten Anweisung enthalten darf).

6
sunny