Oracle "(+)" Operator


155

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 ... (die Suche nach + in Anführungszeichen hat auch nicht funktioniert).

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

Würde es einen Unterschied geben, wenn ich den (+)Operator am Ende der Abfrage entferne ? Muss die Datenbank eine Bedingung erfüllen (z. B. einige Indizes usw.), bevor sie (+)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!


1
Es ist kein Operator. Es ist nur eine Syntax, die sich auf die Arbeit von JOIN auswirkt.
Philipxy

Antworten:


186

Dies ist die Oracle-spezifische Notation für einen OUTER JOIN, da das ANSI-89-Format (Verwendung eines Kommas in der FROM-Klausel zum Trennen von Tabellenreferenzen) OUTER-Joins nicht standardisiert hat.

Die Abfrage wird in ANSI-92-Syntax wie folgt neu geschrieben:

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

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


Es sollte auch beachtet werden, dass Oracle empfiehlt, es nicht zu verwenden , obwohl es (+)funktioniert :

Oracle empfiehlt, dass Sie die FROMKlauselsyntax OUTER JOINanstelle des Oracle-Join-Operators verwenden. Äußere Join-Abfragen, die den Oracle-Join-Operator verwenden, (+)unterliegen den folgenden Regeln und Einschränkungen, die für die FROMKlauselsyntax nicht gelten OUTER JOIN:


79
Genau richtig. Um das (+) gerade in meinem Kopf zu halten (linke Seite gegen rechte Seite), stelle ich mir das (+) gerne als "Hinzufügen von NULL-Werten, wenn keine Übereinstimmung gefunden wurde" vor. Beispiel: "a.id = b.id (+)" bedeutet, dass b.id NULL sein darf, wenn keine Übereinstimmung mit a.id vorliegt.
Strand

danke .. Ich denke, das Hinzufügen aus der Klausel sollte das gleiche Ergebnis liefern !!
Kiran S

Möglicherweise möchten Sie einen Link in der offiziellen Oracle-Dokumentation haben: docs.oracle.com/html/A95915_01/sqopr.htm
Vargan

27

Der Operator (+) gibt eine äußere Verknüpfung an. Dies bedeutet, dass Oracle auch dann Datensätze von der anderen Seite des Joins zurückgibt, wenn keine Übereinstimmung vorliegt. Wenn beispielsweise a und b emp und dept 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 zugewiesen 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 bemerken Sie dies möglicherweise eine Weile nicht!


25

In Oracle bezeichnet (+) die "optionale" Tabelle in 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 LEFT OUTER JOIN von Tabelle 'b' zu Tabelle 'a'. Es werden alle Daten der Tabelle 'a' zurückgegeben, ohne dass ihre Daten verloren gehen, wenn die andere Seite (optionale Tabelle 'b') keine Daten enthält.

Diagramm der linken äußeren Verbindung

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(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

Diagramm der inneren Verbindung

Es werden nur alle Daten zurückgegeben, bei denen sowohl der 'id'- als auch der' b'-Tabellen-ID-Wert gleich sind. Dies bedeutet einen gemeinsamen Teil.

Wenn Sie Ihre Abfrage zu einem Right Join machen möchten

Dies ist genau das gleiche wie ein LEFT JOIN, wechselt jedoch, welche Tabelle optional ist.

Diagramm der rechten äußeren Verbindung

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 anmelden

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


Die Kreisbezeichnungen "table1" & "table2" sind Unsinn. Die einfachste Bedeutung für Kreiselemente ist die Ausgabe von Zeilen. Dann enthält der linke Halbmond die null-erweiterten Zeilen von Tabelle1 und der rechte Halbmond enthält die null-erweiterten Zeilen von Tabelle2. Andere Bedeutungen für die Kreise sind dunkel. Was genau bedeuten die Diagramme Ihrer Meinung nach? Warum haben Sie sie nicht blind in die (schlechten) Präsentationen anderer Leute kopiert?
Philipxy

Sie haben jetzt die Kreise a & b beschriftet. Die Kreise sind keine Reihen von a & b. Die linken und rechten Kreise könnten vernünftigerweise als Reihen einer linken Verbindung b und einer rechten Verbindung b bezeichnet werden. Darüber hinaus beschreiben Sie nicht, was diese eingekreisten Zeilen in Bezug auf die Eingabe sind. Finden Sie selbst heraus, was sich in den Kreisen befindet. Wenn Sie die Etiketten a und b auf die Kreise kleben möchten, erklären Sie in Worten klar, was jedes Etikett mit seinem Kreis zu tun hat. (Es gibt keinen einfachen Grund, sie mit a und b zu kennzeichnen.) Es ist gut, dass Sie die grünen Zonen korrekt gekennzeichnet haben.
philipxy

6

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


Das (+) wird unmittelbar rechts von einem Spaltennamen gesetzt. Diese Antwort ist darüber nicht klar. Was soll "in der Praxis" bedeuten? (Rhetorisch.) (Und Sie meinen wahrscheinlich nicht "Aussage".)
philipxy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.