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 OUTER
usw.
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!
quelle
Antworten:
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:
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 :quelle
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.
Kurz gesagt, das Entfernen des (+) kann einen signifikanten Unterschied bewirken, aber je nach Ihren Daten bemerken Sie dies möglicherweise eine Weile nicht!
quelle
In Oracle bezeichnet (+) die "optionale" Tabelle in JOIN. Also in Ihrer Anfrage,
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.
Die moderne Standardsyntax für dieselbe Abfrage wäre
oder mit einer Abkürzung für
a.id=b.id
(nicht von allen Datenbanken unterstützt):Wenn Sie (+) entfernen, handelt es sich um eine normale innere Verknüpfungsabfrage
Ältere Syntax in Oracle und anderen Datenbanken:
Modernere Syntax:
Oder einfach:
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.
Alte Oracle-Syntax:
Moderne Standardsyntax:
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
quelle
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).
quelle