- 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