Kann mir jemand sagen, ob die folgenden 2 Abfragen ein Beispiel für Left Outer Join oder Right Outer Join sind?
Table Part:
Name Null? Type
PART_ID NOT NULL VARCHAR2(4)
SUPPLIER_ID VARCHAR2(4)
PART_ID SUPPLIER_ID
P1 S1
P2 S2
P3
P4
Table Supplier:
Name Null? Type
SUPPLIER_ID NOT NULL VARCHAR2(4)
SUPPLIER_NAME NOT NULL VARCHAR2(20)
SUPPLIER_ID SUPPLIER_NAME
S1 Supplier#1
S2 Supplier#2
S3 Supplier#3
Zeigen Sie alle Teile an, unabhängig davon, ob ein Lieferant sie liefert oder nicht:
SELECT P.Part_Id, S.Supplier_Name AB Teil P, Lieferant S. WO P.Supplier_Id = S.Supplier_Id (+) SELECT P.Part_Id, S.Supplier_Name AB Teil P, Lieferant S. WHERE S.Supplier_Id (+) = P.Supplier_Id
Antworten:
TableA LEFT OUTER JOIN TableB
ist äquivalent zuTableB RIGHT OUTER JOIN Table A
.(+)
Bezeichnet in Oracle die "optionale" Tabelle in JOIN. In Ihrer ersten Abfrage ist es also aP LEFT OUTER JOIN S
. In Ihrer zweiten Abfrage ist esS RIGHT OUTER JOIN P
. Sie sind funktional gleichwertig.In der Terminologie geben RECHTS oder LINKS an, auf welcher Seite des Joins immer ein Datensatz vorhanden ist, und die andere Seite ist möglicherweise null. Also in einem
P LEFT OUTER JOIN S
,P
wird immer ein Datensatz haben, weil es auf dem istLEFT
, aberS
könnte null sein.Weitere Erklärungen finden Sie in diesem Beispiel von java2s.com .
Zur Verdeutlichung denke ich, dass Terminologie keine Rolle spielt, da sie nur zur Visualisierung dient. Was zählt, ist, dass Sie das Konzept verstehen, wie es funktioniert.
RECHTS gegen LINKS
Ich habe einige Verwirrung darüber gesehen, worauf es bei der Bestimmung von RIGHT vs LEFT in der impliziten Join-Syntax ankommt.
LINKE ÄUSSERE VERBINDUNG
SELECT * FROM A, B WHERE A.column = B.column(+)
RIGHT OUTER JOIN
SELECT * FROM A, B WHERE B.column(+) = A.column
Ich habe nur die Seiten der Begriffe in der WHERE-Klausel ausgetauscht, aber sie sind immer noch funktional gleichwertig. (Weitere Informationen hierzu finden Sie weiter oben in meiner Antwort.) Die Platzierung des
(+)
bestimmt RECHTS oder LINKS. (Insbesondere wenn(+)
sich das rechts befindet, ist es ein LEFT JOIN. Wenn(+)
es sich links befindet, ist es ein RIGHT JOIN.)Arten von JOIN
Die beiden Stile von JOIN sind implizite JOINs und explizite JOINs . Sie sind verschiedene Arten des Schreibens von JOINs, aber sie sind funktional gleichwertig.
Siehe diese SO-Frage .
Implizite JOINs listen einfach alle Tabellen zusammen auf. Die Join-Bedingungen werden in einer WHERE-Klausel angegeben.
Implizite JOIN
SELECT * FROM A, B WHERE A.column = B.column(+)
Explizite JOINs verknüpfen Verknüpfungsbedingungen mit der Aufnahme einer bestimmten Tabelle anstelle einer WHERE-Klausel.
Explizite JOIN
SELECT * FROM A LEFT OUTER JOIN B ON A.column = B.column
Diese impliziten JOINs können schwieriger zu lesen und zu verstehen sein und sie haben auch einige Einschränkungen, da die Join-Bedingungen in anderen WHERE-Bedingungen gemischt sind. Daher werden implizite JOINs im Allgemeinen zugunsten einer expliziten Syntax empfohlen.
quelle
JOIN
stattdessen die idiomatische Syntax! Dann gibt es keinen Raum für Verwirrung.FULL OUTER JOIN
Syntax müssen SieUNION [ALL]
zwei Ergebnismengen zusammen verwenden: eine für A = B (+) und eine für B = A (+). Beispiel in dieser Frage .Diese beiden Abfragen werden ausgeführt
OUTER JOIN
. Siehe untenEntnommen aus http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries006.htm
quelle
Ich habe in den obigen Antworten einige Widersprüche gesehen. Ich habe gerade Folgendes unter Oracle 12c versucht und Folgendes ist richtig:
SELECT * FROM A, B WHERE A.column = B.column(+)
SELECT * FROM A, B WHERE B.column(+) = A.column
quelle
LINKE ÄUSSERE VERBINDUNG
SELECT * FROM A, B WHERE A.column = B.column (+)
RIGHT OUTER JOIN
SELECT * FROM A, B WHERE A.column (+) = B.column
quelle
Dieser Thread enthält einige falsche Informationen. Ich habe die falschen Informationen kopiert und eingefügt:
Das obige ist FALSCH !!!!! Es ist umgekehrt. Wie ich festgestellt habe, dass es falsch ist, stammt aus dem folgenden Buch:
Oracle OCP Einführung in Oracle 9i: SQL Exam Guide . Seite 115 Tabelle 3-1 enthält eine gute Zusammenfassung. Ich konnte nicht herausfinden, warum mein konvertiertes SQL nicht richtig funktionierte, bis ich auf die alte Schule ging und in einem gedruckten Buch nachschaute!
Hier ist die Zusammenfassung aus diesem Buch, Zeile für Zeile kopiert:
Oracle Outer Join Syntax:
ANSI / ISO-Äquivalent:
Beachten Sie hier, dass es das Gegenteil von dem ist, was oben angegeben ist. Ich nehme an, es ist möglich, dass dieses Buch Errata enthält, aber ich vertraue diesem Buch mehr als dem, was in diesem Thread steht. Es ist ein Prüfungsleitfaden zum lauten Schreien ...
quelle
a.col_1(+) = b.col_1
Übereinstimmung RIGHT JOIN, nicht LEFT JOIN.