2010-10-26 8 views
117

Ich überprüfe einige alte SQL-Anweisungen, um sie zu dokumentieren und wahrscheinlich zu verbessern.Oracle "(+)" Operator

Das DBMS ist Oracle

ich keine Aussage verstanden, die wie folgt lauten:

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

Ich bin verwirrt über die (+) Operator, und konnte es nicht an irgendwelchen Foren bekommen ... (Suche nach + in Anführungszeichen funktionierte auch nicht).

Wie auch immer, ich habe ‚Erklären Plan‘ von sqldeveloper und ich habe sagte eine Ausgabe, dass HASH JOIN, RIGHT OUTER usw.

Gäbe es einen Unterschied, wenn ich die (+) Bediener am Ende der Abfrage entfernen? Muss die Datenbank eine bestimmte Bedingung (wie einige Indizes usw.) erfüllen, bevor (+) verwendet werden kann? Es wäre sehr hilfreich, wenn Sie mir ein einfaches Verständnis oder einige gute Links liefern könnten, wo ich darüber lesen kann.

Danke!

Antwort

147

Das ist Oracle-spezifische Notation für einen OUTER JOIN, weil das ANSI-89-Format (das ein Komma in der FROM-Klausel verwendet, um Tabellenreferenzen zu trennen) OUTER-Joins nicht standardisiert hat.

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

This link is pretty good at explaining the difference between JOINs:

Die Abfrage würde in ANSI-92-Syntax als neu geschrieben werden.


Es sollte auch, dass, obwohl die (+) Werke anzumerken, Oracle recommends not using it:

Oracle empfiehlt, die FROM Klausel OUTER JOIN Syntax verwenden, anstatt der Oracle-Operator verbinden. Outer Join-Abfragen, die die Oracle-Join-Operator verwenden (+) unterliegen den folgenden Regeln und Einschränkungen, die der FROM Klausel OUTER JOIN Syntax nicht gelten:

+0

Oh danke! - Habe das überhaupt nicht erwartet !! – Sekhar

+60

Genau richtig. Um die (+) - Gerade in meinem Kopf (linke Seite vs. rechte Seite) zu behalten, stelle ich mir das (+) als "NULL-Werte hinzufügen, wenn keine Übereinstimmung gefunden wurde" vor. Zum Beispiel bedeutet "a.id = b.id (+)", dass b.id NULL ist, wenn es keine Übereinstimmung mit a.id gibt. – beach

+0

danke..ich denke, es in from Klausel hinzufügen sollte das gleiche Ergebnis !! –

24

Der Operator (+) zeigt eine äußere Verknüpfung. Dies bedeutet, dass Oracle auch dann Datensätze von der anderen Seite der Verknüpfung zurückgibt, wenn keine Übereinstimmung vorhanden ist. Wenn beispielsweise a und b emp und dept sind und Sie Mitarbeitern die Zuordnung zu einer Abteilung verweigern können, gibt die folgende Anweisung Details zu allen Mitarbeitern zurück, unabhängig davon, ob sie einer Abteilung zugewiesen wurden oder nicht.

Kurz gesagt, das Entfernen der (+) kann einen Signifikanzunterschied machen, aber Sie werden möglicherweise eine Weile nicht bemerken, abhängig von Ihren Daten!

5

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

8

In Oracle bezeichnet (+) die "optionale" Tabelle im JOIN.So 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 'b' Tabelle mit 'a' Tisch. Wie bei einer modernen linken Join-Abfrage. (Es wird gibt alle Daten von ‚a‘ Tabelle ohne seine Daten auf der anderen Seite optional Tabelle ‚b‘ verliert seine Daten verloren kann) enter image description here

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Left join b ON a.id=b.id 

ODER

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Left join b using(id) 

jetzt, wenn Sie entfernen (+), dann wird es normal sein innere Join-Abfrage,

select a.id, b.id, a.col_2, b.col_2, ... 
from a,b 
where a.id=b.id 

enter image description here

es gibt nur alle Daten zurück, wo 'a' & 'b' Tabellen 'id' Wert ist gleich, bedeutet gemeinsamen Teil.

Extra: Wenn Sie Ihre Abfrage wie rechts in älterem Format oder modernen beitreten machen wollen, dann wird es so wie unten angezeigt:

enter image description here

Alt:

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

Modern:

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Right join b ON a.id=b.id 

ODER

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Right join b using(id) 

Ref & Hilfe:

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

Left Outer Join using + sign in Oracle 11g

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