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 ;