• 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 JOINder booksund languagesTabellen durchführen anstatt also den bedeutungslosen language_idWert 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 JOINnicht 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 JOINSist.

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