Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Linke und rechte Joins mit dem Pluszeichen (+) in Oracle

  • Was ist ein Inner Join?
  • Was ist ein Outer Join?
    • Durchführen von äußeren Verknüpfungen mit dem (+)-Symbol

Wie praktisch alle relationalen Datenbanken ermöglicht Oracle das Generieren von Abfragen, die kombinieren oder JOIN Zeilen aus zwei oder mehr Tabellen, um die endgültige Ergebnismenge zu erstellen. Obwohl es zahlreiche Typen gibt Von den Joins, die durchgeführt werden können, sind die häufigsten INNER JOIN und der OUTER JOIN .

In diesem Tutorial werden wir kurz den Unterschied zwischen INNER untersuchen und OUTER JOIN und untersuchen Sie dann die Kurzschriftmethode, die Oracle für die Ausführung von OUTER JOINS bereitstellt speziell mit + Operatorsymbol.

Was ist ein innerer Join?

Ein 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 .

Hier haben wir zum Beispiel eine einfache library Schema mit zwei Tabellen:books und languages . Die languages Tabelle ist nur eine Liste möglicher Sprachnamen und einer eindeutigen Sprach-id :

SELECT * FROM library.languages;

id   name
1   English
2   French
3   German
4   Mandarin
5   Spanish
6   Arabic
7   Japanese
8   Russian
9   Greek
10   Italian

In der Zwischenzeit unsere books Tabelle hat eine language_id Zeile, die für die meisten, aber nicht alle Bücher einfach die language_id enthält in Verbindung mit der ursprünglich veröffentlichten Sprache des Buches:

SELECT * FROM
  books
ORDER BY
  id
FETCH FIRST 10 ROWS ONLY;

id title    author    year_published    language_id
1   In Search of Lost Time  Marcel Proust   1913    2
2   Ulysses James Joyce 1922    1
3   Don Quixote Miguel de Cervantes 1605    5
4   Moby Dick   Herman Melville 1851    1
5   Hamlet  William Shakespeare 1601 (null)
6   War and Peace   Leo Tolstoy 1869    8
7   The Odyssey Homer   -700    9
8   The Great Gatsby    F. Scott Fitzgerald 1925    1
9   The Divine Comedy   Dante Alighieri     1472    10
10  Madame Bovary   Gustave Flaubert    1857    2

In vielen Fällen möchten wir möglicherweise einen INNER JOIN ausführen der books und languages Tabellen, anstatt die bedeutungslose language_id anzuzeigen Wert jedes Buches, können wir tatsächlich den language name sehen stattdessen.

SELECT
  b.id,
  b.title,
  b.author,
  b.year_published,
  l.name language
FROM
  books b
INNER JOIN
  library.languages l
ON
  b.language_id = l.id
ORDER BY
  b.id
FETCH FIRST 10 ROWS ONLY;

id title    author    year_published    language
1   In Search of Lost Time  Marcel Proust   1913    French
2   Ulysses James Joyce 1922    English
3   Don Quixote Miguel de Cervantes 1605    Spanish
4   Moby Dick   Herman Melville 1851    English
6   War and Peace   Leo Tolstoy 1869    Russian
7   The Odyssey Homer   -700    Greek
8   The Great Gatsby    F. Scott Fitzgerald 1925    English
9   The Divine Comedy   Dante Alighieri     1472    Italian
10  Madame Bovary   Gustave Flaubert    1857    French
11  The Brothers Karamazov  Fyodor Dostoyevsky  1880    Russian

Was hier wichtig ist, ist, dass unsere Ergebnismenge bei den beiden obigen Abfragen leicht unterschiedlich war. Im ersten haben wir einfach die ersten 10 aufgelistet Bücher, sondern im INNER JOIN Abfrage geben wir nur Ergebnisse zurück, die alle Bedingungen aus beiden Tabellen erfüllen. Aus diesem Grund die Aufzeichnung von Hamlet (die eine language_id hat Wert von null oder leer) wird ignoriert und nicht im Ergebnis unseres INNER JOIN zurückgegeben .

Was ist ein Outer Join?

Anstatt ausschließlich Ergebnisse zurückzugeben, die alle Join-Bedingungen eines INNER JOIN erfüllen , ein OUTER JOIN liefert nicht nur Ergebnisse, die alle Bedingungen erfüllen, sondern auch gibt Zeilen aus einer Tabelle zurück, die die Bedingung nicht erfüllt haben. Die Tabelle, die für diese „Umgehung“ bedingter Anforderungen ausgewählt wird, wird durch die Richtung oder „Seite“ der Verknüpfung bestimmt, die normalerweise als LEFT bezeichnet wird oder RIGHT äußere Joins.

Beim Definieren einer Seite zu Ihrem OUTER JOIN , geben Sie an, welche Tabelle immer ihre Zeile zurückgibt, auch wenn die gegensätzliche Tabelle auf der anderen Seite des Joins fehlt oder null Werte als Teil der Fügebedingung.

Wenn wir also denselben grundlegenden JOIN ausführen wie oben, um books abzurufen und language names , wissen wir, dass unsere books Tabelle sollte immer Daten zurückgeben, also unser JOIN Seite sollte auf unsere books „zeigen“. Tabelle, wodurch die languages erstellt werden Tabelle OUTER Tabelle, die wir daran anhängen.

Um dies zu erreichen, ändern wir einfach:

books b INNER JOIN library.languages l

… dazu:

books b LEFT OUTER JOIN library.languages l

Somit sieht die gesamte Abfrage und Ergebnismenge fast identisch mit dem INNER JOIN aus außer dieser kleinen Änderung:

SELECT
  b.id,
  b.title,
  b.author,
  b.year_published,
  l.name language
FROM
  books b
LEFT OUTER JOIN
  library.languages l
ON
  b.language_id = l.id
ORDER BY
  b.id
FETCH FIRST 10 ROWS ONLY;

id title    author    year_published    language
1   In Search of Lost Time  Marcel Proust   1913    French
2   Ulysses James Joyce 1922    English
3   Don Quixote Miguel de Cervantes 1605    Spanish
4   Moby Dick   Herman Melville 1851    English
5   Hamlet  William Shakespeare 1601  (null)
6   War and Peace   Leo Tolstoy 1869    Russian
7   The Odyssey Homer   -700    Greek
8   The Great Gatsby    F. Scott Fitzgerald 1925    English
9   The Divine Comedy   Dante Alighieri     1472    Italian
10  Madame Bovary   Gustave Flaubert    1857    French

Wie erwartet durch Verwendung eines LEFT OUTER JOIN anstelle des bisherigen INNER JOIN , bekommen wir das Beste aus beiden Welten:Wir überspringen keine books Datensätze (wie Hamlet ) einfach weil die language_id Wert ist null für diesen Datensatz, jedoch für alle Datensätze, bei denen language_id existiert, erhalten wir den schön formatierten language name von unseren languages erhalten Tabelle.

Durchführen von äußeren Joins mit dem (+)-Symbol

Wie in der offiziellen Dokumentation angegeben, bietet Oracle einen speziellen outer join operator (der + symbol), das ist eine Abkürzung für die Ausführung von OUTER JOINS .

In der Praxis ist das + Symbol wird direkt in die Bedingung gestellt -Anweisung und auf der Seite der optionalen Tabelle (diejenige, die leer oder null enthalten darf Werte innerhalb der Bedingung).

Daher können wir unseren obigen LEFT OUTER JOIN noch einmal umschreiben Anweisung mit + Operator wie folgt:

SELECT
  b.id,
  b.title,
  b.author,
  b.year_published,
  l.name language
FROM
  books b,
  library.languages l
WHERE
  l.id (+)= b.language_id
ORDER BY
  b.id
FETCH FIRST 10 ROWS ONLY;

Die Ergebnisse sind dieselben wie beim standardmäßigen LEFT OUTER JOIN Beispiel oben, daher nehmen wir sie hier nicht auf. Es gibt jedoch einen kritischen Aspekt, der bei der Syntax mit + zu beachten ist Operator für OUTER JOINS .

Das + Betreiber muss auf der linken Seite der Bedingung sein (links vom Gleichheitszeichen = Schild). Deshalb in diesem Fall, weil wir sicherstellen wollen, dass unsere languages table ist die optionale Tabelle, die null zurückgeben kann Bei diesem Vergleich haben wir die Reihenfolge der Tabellen in dieser Bedingung vertauscht, also languages steht auf der linken Seite (und ist optional) während books befindet sich auf der rechten Seite.

Schließlich wegen dieser Neuordnung der Tabellenseiten in der Bedingung bei Verwendung von + -Operator ist es wichtig zu wissen, dass das obige einfach eine Abkürzung für einen RIGHT OUTER JOIN ist . Das bedeutet, dass dieses Snippet der Abfrage:

FROM
  books b,
  library.languages l
WHERE
  l.id (+)= b.language_id

… ist praktisch identisch mit:

FROM
  library.languages l
RIGHT OUTER JOIN
  books b
ON
  b.language_id = l.id