Verwenden von äußeren Joins
Innere Joins geben nur Zeilen zurück, wenn mindestens eine Zeile aus beiden Tabellen vorhanden ist, die der Joinbedingung entspricht. Innere Joins entfernen die Zeilen, die nicht mit einer Zeile aus der anderen Tabelle übereinstimmen. Äußere Joins dagegen geben alle Zeilen aus mindestens einer der in der FROM-Klausel genannten Tabellen oder Sichten zurück, sofern diese Zeilen ggf. die WHERE- oder HAVING-Suchbedingungen erfüllen. Es werden alle Zeilen aus der linken Tabelle, auf die in einem linken äußeren Join verwiesen wird, und alle Zeilen aus der rechten Tabelle, auf die in einem rechten äußeren Join verwiesen wird, abgerufen. Alle Zeilen aus beiden Tabellen werden in einem vollständigen äußeren Join zurückgegeben.
SQL Server verwendet die folgenden ISO-Kennwörter für die in einer FROM-Klausel angegebenen äußeren Joins:
LEFT OUTER JOIN oder LEFT JOIN
RIGHT OUTER JOIN oder RIGHT JOIN
FULL OUTER JOIN oder FULL JOIN
Verwenden von linken äußeren Joins
Betrachten Sie einen Join der Product-Tabelle und der ProductReview-Tabelle über deren ProductID-Spalten. Die Ergebnisse zeigen nur die Produkte, für die Bewertungen geschrieben wurden.
Verwenden Sie einen linken äußeren Join von ISO, um alle Produkte in die Ergebnisse aufzunehmen, unabhängig davon, ob für die Produkte eine Bewertung abgegeben wurde oder nicht. Im Folgenden wird die Abfrage aufgeführt:
USE AdventureWorks2008R2;
GO
SELECT p.Name, pr.ProductReviewID
FROM Production.Product p
LEFT OUTER JOIN Production.ProductReview pr
ON p.ProductID = pr.ProductID
Der linke äußere Join (LEFT OUTER JOIN) nimmt alle Zeilen in der Product-Tabelle in die Ergebnisse auf, unabhängig davon, ob eine Übereinstimmung mit der ProductID-Spalte in der ProductReview-Tabelle besteht. Beachten Sie, dass in den Ergebnissen, in denen es keine übereinstimmende Produktbewertungs-ID für ein Produkt gibt, die Zeile in der ProductReviewID-Spalte einen Nullwert enthält.
Verwenden von rechten äußeren Joins
Betrachten Sie einen Join der SalesTerritory-Tabelle und der SalesPerson-Tabelle über deren TerritoryID-Spalten. Die Ergebnisse zeigen alle Regionen, die einem Vertriebsmitarbeiter zugewiesen wurden. Der ISO-Operator für den rechten äußeren Join, RIGHT OUTER JOIN, gibt an, dass alle Zeilen in der zweiten Tabelle in die Ergebnisse übernommen werden sollen, unabhängig davon, ob entsprechende Daten in der ersten Tabelle enthalten sind.
Mit einem rechten äußeren Join von ISO nehmen Sie alle Vertriebsmitarbeiter in die Ergebnisse auf, unabhängig davon, ob ihnen eine Region zugewiesen wurde oder nicht. Es folgen die Transact-SQL-Abfrage und die Ergebnisse des rechten äußeren Join:
USE AdventureWorks2008R2;
GO
SELECT st.Name AS Territory, sp.BusinessEntityID
FROM Sales.SalesTerritory st
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID ;
Dies ist das Resultset.
Territory BusinessEntityID
-------------------------------------------------- -------------
NULL 268
Northeast 275
Southwest 276
Central 277
Canada 278
Southeast 279
Northwest 280
Southwest 281
Canada 282
Northwest 283
NULL 284
United Kingdom 285
France 286
Northwest 287
NULL 288
Germany 289
Australia 290
(17 Zeile(n) betroffen)
Ein äußerer Join kann durch Verwenden eines Prädikats weiter eingeschränkt werden. Dieses Beispiel enthält ebenfalls einen rechten äußeren Join, enthält jedoch ausschließlich Vertriebsregionen mit einem Umsatz von weniger als 2.000.000$.
USE AdventureWorks2008R2;
GO
SELECT st.Name AS Territory, sp.BusinessEntityID
FROM Sales.SalesTerritory st
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID
WHERE st.SalesYTD < $2000000;
Weitere Informationen zu Prädikaten finden Sie unter WHERE (Transact-SQL).
Verwenden von vollständigen äußeren Joins
Um die nicht übereinstimmenden Daten durch Einfügen der nicht übereinstimmenden Zeilen in die Ergebnisse eines Joins beizubehalten, sollten Sie einen vollständigen äußeren Join verwenden. SQL Server stellt den Operator für vollständige äußere Joins, FULL OUTER JOIN, bereit, der alle Zeilen aus beiden Tabellen einschließt, unabhängig davon, ob die andere Tabelle einen übereinstimmenden Wert enthält.
Betrachten Sie einen Join der Product-Tabelle und der SalesOrderDetail-Tabelle über deren ProductID-Spalten. Die Ergebnisse zeigen nur die Produkte, für die es Bestellungen gibt. Der FULL OUTER JOIN-Operator von ISO gibt an, dass alle Zeilen aus beiden Tabellen in die Ergebnisse übernommen werden sollen, unabhängig davon, ob übereinstimmende Daten in den Tabellen enthalten sind.
Sie können eine WHERE-Klausel mit einem vollständigen äußeren Join einschließen, um nur die Zeilen zurückzugeben, in denen es keine zwischen den Tabellen übereinstimmenden Daten gibt. Die folgende Abfrage gibt nur solche Produkte zurück, denen keine Bestellung zugeordnet ist, sowie die Bestellungen, die keinem Produkt zugeordnet sind (obwohl in diesem Fall alle Bestellungen einem Produkt zugeordnet sind).
USE AdventureWorks2008R2;
GO
-- The OUTER keyword following the FULL keyword is optional.
SELECT p.Name, sod.SalesOrderID
FROM Production.Product p
FULL OUTER JOIN Sales.SalesOrderDetail sod
ON p.ProductID = sod.ProductID
WHERE p.ProductID IS NULL
OR sod.ProductID IS NULL
ORDER BY p.Name ;