- Was ist ein innerer Join?
- Was ist ein Outer-Join?
- Ausführen äußerer Joins mit dem ( + ) Symbol
Wie praktisch alle relationalen Datenbanken ermöglicht Oracle die Generierung von Abfragen, die kombinieren oder JOIN
Zeilen aus zwei oder mehr Tabellen, um die endgültige Ergebnismenge zu erstellen., Während es zahlreiche Arten von Joins gibt, die ausgeführt werden können, sind die häufigsten INNER JOIN
und die OUTER JOIN
.
In diesem Tutorial werden wir kurz den Unterschied zwischen INNER
und OUTER JOIN
untersuchen und dann die Kurzschrift untersuchen Methode Oracle bietet zum Ausführen von OUTER JOINS
speziell mit dem +
Operatorsymbol.
Was ist ein Inner Join?,
Eine INNER JOIN
in einer relationalen Datenbank ist einfach das Verbinden von zwei oder mehr Tabellen, in denen das Ergebnis nur Daten enthält, die alle Join-Bedingungen erfüllen.
Zum Beispiel haben wir hier ein einfacheslibrary
Schema mit zwei Tabellen:books
undlanguages
.,>
Inzwischen hat unsere books
– Tabelle eine language_id
– Zeile, die für die meisten, aber nicht alle Bücher einfach die language_id
enthält, die der ursprünglich veröffentlichten Sprache des Buches zugeordnet ist:
SELECT * FROM booksORDER BY idFETCH FIRST 10 ROWS ONLY;id title author year_published language_id1 In Search of Lost Time Marcel Proust 1913 22 Ulysses James Joyce 1922 13 Don Quixote Miguel de Cervantes 1605 54 Moby Dick Herman Melville 1851 15 Hamlet William Shakespeare 1601 (null)6 War and Peace Leo Tolstoy 1869 87 The Odyssey Homer -700 98 The Great Gatsby F. Scott Fitzgerald 1925 19 The Divine Comedy Dante Alighieri 1472 1010 Madame Bovary Gustave Flaubert 1857 2
div>
In vielen Fällen möchten wir möglicherweise eine INNER JOIN
der books
und languages
Tabellen durchführen anstatt also den bedeutungslosen language_id
Wert jedes Buches anzuzeigen, können wir tatsächlich den language name
stattdessen.,
SELECT b.id, b.title, b.author, b.year_published, l.name languageFROM books bINNER JOIN library.languages lON b.language_id = l.idORDER BY b.idFETCH FIRST 10 ROWS ONLY;id title author year_published language1 In Search of Lost Time Marcel Proust 1913 French2 Ulysses James Joyce 1922 English3 Don Quixote Miguel de Cervantes 1605 Spanish4 Moby Dick Herman Melville 1851 English6 War and Peace Leo Tolstoy 1869 Russian7 The Odyssey Homer -700 Greek8 The Great Gatsby F. Scott Fitzgerald 1925 English9 The Divine Comedy Dante Alighieri 1472 Italian10 Madame Bovary Gustave Flaubert 1857 French11 The Brothers Karamazov Fyodor Dostoyevsky 1880 Russian
Entscheidend ist, dass sich unsere Ergebnismenge in den beiden obigen Abfragen geringfügig unterschied. In der ersten haben wir einfach die ersten 10
Bücher aufgelistet, aber in der INNER JOIN
Abfrage geben wir nur Ergebnisse zurück, die alle Bedingungen aus beiden Tabellen erfüllen. Aus diesem Grund wird der Datensatz von Hamlet
(der einen language_id
Wert von oder leer hat) ignoriert und im Ergebnis unserer INNER JOIN
nicht zurückgegeben.,
Was ist ein Outer-Join?
Anstatt ausschließlich Ergebnisse zurückzugeben, die alle Join-Bedingungen einer INNER JOIN
erfüllen, gibt eine OUTER JOIN
nicht nur Ergebnisse zurück, die alle Bedingungen erfüllen, sondern auch Zeilen aus einer Tabelle zurück, die die Bedingung nicht erfüllt hat. Die Tabelle, die für diese „Umgehung“ bedingter Anforderungen ausgewählt wird, wird durch die Direktionalität oder „Seite“ des Joins bestimmt, die typischerweise als LEFT
oder RIGHT
äußere Joins bezeichnet wird.,
Wenn Sie eine Seite für Ihre OUTER JOIN
definieren, geben Sie an, welche Tabelle immer ihre Zeile zurückgibt, auch wenn die gegenüberliegende Tabelle auf der anderen Seite des Joins fehlt oder null
Werte als Teil der Verbindungsbedingung.,
Wenn wir also dieselbe grundlegende JOIN
wie oben ausführen, um books
und language names
abzurufen, wissen wir, dass unsere books
– Tabelle immer Daten zurückgeben sollte, sodass unsere JOIN
– Seite auf unsere Tabelle, wodurch die languages
Tabelle die OUTER
Tabelle, die wir an sie anhängen.,> mit Ausnahme dieser geringfügigen Änderung:
SELECT b.id, b.title, b.author, b.year_published, l.name languageFROM books bLEFT OUTER JOIN library.languages lON b.language_id = l.idORDER BY b.idFETCH FIRST 10 ROWS ONLY;id title author year_published language1 In Search of Lost Time Marcel Proust 1913 French2 Ulysses James Joyce 1922 English3 Don Quixote Miguel de Cervantes 1605 Spanish4 Moby Dick Herman Melville 1851 English5 Hamlet William Shakespeare 1601 (null)6 War and Peace Leo Tolstoy 1869 Russian7 The Odyssey Homer -700 Greek8 The Great Gatsby F. Scott Fitzgerald 1925 English9 The Divine Comedy Dante Alighieri 1472 Italian10 Madame Bovary Gustave Flaubert 1857 French
Verwenden Sie erwartungsgemäß eine LEFT OUTER JOIN
anstelle der vorherigen INNER JOIN
erhalten wir das Beste aus beiden Welten: Wir überspringen keine books
– Datensätze (z. B. Hamlet
) einfach weil der language_id
Wert für diesen Datensatz null
ist, erhalten wir für alle Datensätze, in denen language_id
vorhanden ist, die schön formatierte language name
, die wir von unserer languages
tabelle.,
Ausführen äußerer Joins Mit dem ( + ) Symbol
Wie in der offiziellen Dokumentation angegeben, bietet Oracle ein spezielles outer join operator
(das +
Symbol), das eine Abkürzung für die Ausführung von OUTER JOINS
ist.
In der Praxis wird das +
– Symbol direkt in der Bedingungsanweisung und auf der Seite der optionalen Tabelle platziert (diejenige, die leere oder – Werte innerhalb der Bedingung enthalten darf).,
Daher können wir unsere obige LEFT OUTER JOIN
– Anweisung erneut mit dem Operator +
wie folgt umschreiben:
Die Ergebnisse sind die gleichen wie das obige Beispiel LEFT OUTER JOIN
, daher werden wir sie hier nicht einbeziehen. Es gibt jedoch einen kritischen Aspekt bei der Syntax mit dem Operator +
für OUTER JOINS
.
Der Operator +
muss sich auf der linken Seite der Bedingung befinden(links vom Zeichen equals =
)., Da wir in diesem Fall sicherstellen möchten, dass unsere languages
– Tabelle die optionale Tabelle ist, die null
– Werte während dieses Vergleichs zurückgeben kann, haben wir daher die Reihenfolge der Tabellen in dieser Bedingung getauscht languages
ist links (und ist optional), während books
rechts ist.
Schließlich ist es aufgrund dieser Neuordnung der Tabellenseiten in der Bedingung bei Verwendung des Operators +
wichtig zu erkennen, dass das Obige einfach eine Abkürzung für a RIGHT OUTER JOIN
., Dies bedeutet, dass dieser Ausschnitt aus der query:
FROM books b, library.languages lWHERE l.id (+)= b.language_id
…ist effektiv identisch:
FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id
Schreibe einen Kommentar