Verwenden äußerer Verknüpfungen
Die Verwendung äußerer Verknüpfungen in einer Mehrtabellenabfrage kann zwar nicht so häufig wie innere Verknüpfungen sein, aber eine alternative Ansicht Ihrer Geschäftsdaten bieten. Wie bei inneren Verknüpfungen werden Sie eine logische Beziehung zwischen den Tabellen ausdrücken. Sie rufen jedoch nicht nur Zeilen mit übereinstimmenden Attributen ab, sondern auch alle Zeilen, die in einer oder beiden Tabellen vorhanden sind, unabhängig davon, ob eine Übereinstimmung in der anderen Tabelle vorhanden ist.
Zuvor haben Sie erfahren, wie Sie eine INNER JOIN verwenden, um übereinstimmende Zeilen zwischen zwei Tabellen zu finden. Wie Sie gesehen haben, erstellt der Abfrageprozessor die Ergebnisse einer INNER JOIN-Abfrage, indem Zeilen gefiltert werden, die nicht den Bedingungen entsprechen, die im ON-Klausel-Prädikat ausgedrückt werden. Das Ergebnis ist, dass nur Zeilen mit einer übereinstimmenden Zeile in der anderen Tabelle zurückgegeben werden. Mit einer OUTER JOIN können Sie auswählen, dass alle Zeilen mit übereinstimmenden Zeilen zwischen den Tabellen sowie alle Zeilen angezeigt werden, die keine Übereinstimmung in der anderen Tabelle aufweisen. Sehen wir uns ein Beispiel an und untersuchen dann den Prozess.
Überprüfen Sie zunächst die folgende Abfrage, die mit einer INNER JOIN geschrieben wurde:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Diese Zeilen stellen eine Übereinstimmung zwischen HR.Mitarbeiter und Sales.SalesOrder dar. Nur die EmployeeID-Werte , die sich in beiden Tabellen befinden, werden in den Ergebnissen angezeigt.
Untersuchen Sie als Nächstes die folgende Abfrage, die als LEFT OUTER JOIN geschrieben wurde:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT OUTER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
In diesem Beispiel wird ein LEFT OUTER JOIN-Operator verwendet, der den Abfrageprozessor anweist, alle Zeilen der Tabelle auf der linken Seite (HR.Employee) beizubehalten und die Amount-Werte für übereinstimmende Zeilen in Sales.SalesOrder anzuzeigen. Allerdings werden alle Mitarbeiter zurückgegeben, unabhängig davon, ob sie einen Verkaufsauftrag übernommen haben. Anstelle des Betragswerts gibt die Abfrage NULL für Mitarbeiter ohne übereinstimmende Verkaufsaufträge zurück.
OUTER JOIN-Syntax
Äußere Joins werden mithilfe der Schlüsselwörter LEFT, RIGHT oder FULL vor OUTER JOIN ausgedrückt. Der Zweck des Schlüsselworts besteht darin, anzugeben, welche Tabelle (auf welcher Seite des Schlüsselworts JOIN) beibehalten werden soll und welche Zeilen angezeigt werden sollen; übereinstimmung oder keine Übereinstimmung.
Wenn Sie eine Verknüpfung mithilfe von LEFT, RIGHT oder FULL definieren, können Sie das OUTER-Schlüsselwort wie hier gezeigt weglassen:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Wie das INNER-Schlüsselwort ist es jedoch oft hilfreich, Code zu schreiben, der explizit die Art der verwendeten Verknüpfung angibt.
Beachten Sie beim Schreiben von Abfragen mit OUTER JOIN die folgenden Richtlinien:
- Wie Sie gesehen haben, werden Tabellenaliasen nicht nur für die SELECT-Liste, sondern auch für die ON-Klausel bevorzugt.
- Wie bei einer INNER JOIN kann eine OUTER JOIN für eine einzelne übereinstimmende Spalte oder für mehrere übereinstimmende Attribute ausgeführt werden.
- Anders als bei INNER JOIN ist die Reihenfolge, in der Tabellen in der FROM-Klausel aufgeführt und verknüpft werden, bei einem OUTER JOIN relevant, da sie bestimmt, ob Sie das Schlüsselwort LEFT oder RIGHT für Ihren Join auswählen.
- Joins mehrerer Tabellen sind komplexer, wenn ein OUTER JOIN vorliegt. Das Vorhandensein von NULLs in den Ergebnissen eines OUTER JOIN kann Probleme verursachen, wenn die Zwischenergebnisse dann mit einer dritten Tabelle verknüpft werden. Zeilen mit NULLs können nach dem Prädikat der zweiten Verknüpfung herausgefiltert werden.
- Um nur Zeilen anzuzeigen, für die keine Übereinstimmung vorhanden ist, fügen Sie in einer WHERE-Klausel nach einem OUTER JOIN-Prädikat einen Test für NULL hinzu.
- FULL OUTER JOIN wird selten verwendet. Bei dieser Abfrage werden alle zwischen den zwei Tabellen übereinstimmenden Zeilen sowie alle Zeilen der ersten Tabelle mit keiner Übereinstimmung in der zweiten Tabelle und alle Zeilen der zweiten Tabelle ohne Übereinstimmung in der ersten Tabelle zurückgegeben.
- Ohne eine ORDER BY-Klausel gibt es keine Möglichkeit zum Vorhersagen der Reihenfolge, in der die Zeilen zurückgegeben werden. Es gibt keine Möglichkeit zu wissen, ob die übereinstimmenden oder nicht übereinstimmenden Zeilen zuerst zurückgegeben werden.