Freigeben über


Verwenden von äußeren Verknüpfungen

Innere Verknüpfungen geben nur Zeilen zurück, wenn in beiden Tabellen mindestens jeweils eine Zeile vorhanden ist, die der Verknüpfungsbedingung entspricht. Innere Verknüpfungen entfernen die Zeilen, die nicht mit einer Zeile aus der anderen Tabelle übereinstimmen. Äußere Verknüpfungen 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 einer linken äußeren Verknüpfung verwiesen wird, und alle Zeilen aus der rechten Tabelle, auf die in einer rechten äußeren Verknüpfung verwiesen wird, abgerufen. Alle Zeilen aus beiden Tabellen werden in einer vollständigen äußeren Verknüpfung zurückgegeben.

SQL Server verwendet die folgenden ISO-Kennwörter für die in einer FROM-Klausel angegebenen äußeren Verknüpfungen:

  • LEFT OUTER JOIN oder LEFT JOIN

  • RIGHT OUTER JOIN oder RIGHT JOIN

  • FULL OUTER JOIN oder FULL JOIN

Verwenden von linken äußeren Verknüpfungen

Ziehen Sie z. B. eine Verknüpfung der Product-Tabelle und der ProductReview-Tabelle über deren ProductID-Spalten in Betracht. Die Ergebnisse zeigen nur die Produkte, für die Bewertungen geschrieben wurden.

Verwenden Sie eine linke äußere Verknüpfung 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 AdventureWorks;
GO
SELECT p.Name, pr.ProductReviewID
FROM Production.Product p
LEFT OUTER JOIN Production.ProductReview pr
ON p.ProductID = pr.ProductID

Die linke äußere Verknüpfung (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 Verknüpfungen

Ziehen Sie z. B. eine Verknüpfung der SalesTerritory-Tabelle und der SalesPerson-Tabelle über deren TerritoryID-Spalten in Betracht. Die Ergebnisse zeigen alle Regionen, die einem Vertriebsmitarbeiter zugewiesen wurden. Der ISO-Operator für die rechte äußere Verknüpfung, 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 einer rechten äußeren Verknüpfung 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 der rechten äußeren Verknüpfung:

USE AdventureWorks;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesTerritory st 
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID ;

Dies ist das Resultset.

Territory                                          SalesPersonID
-------------------------------------------------- -------------
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 row(s) affected)

Eine äußere Verknüpfung kann durch Verwenden eines Prädikats weiter eingeschränkt werden. Dieses Beispiel enthält ebenfalls eine rechte äußere Verknüpfung, enthält jedoch ausschließlich Vertriebsregionen mit einem Umsatz von weniger als 2.000.000$.

USE AdventureWorks;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
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 Verknüpfungen

Um die nicht übereinstimmenden Daten durch Einfügen der nicht übereinstimmenden Zeilen in die Ergebnisse einer Verknüpfung beizubehalten, sollten Sie eine vollständige äußere Verknüpfung verwenden. SQL Server stellt den Operator für vollständige äußere Verknüpfungen, FULL OUTER JOIN, bereit, der alle Zeilen aus beiden Tabellen einschließt, unabhängig davon, ob die andere Tabelle einen übereinstimmenden Wert enthält.

Ziehen Sie z. B. eine Verknüpfung der SalesTerritory-Tabelle und der SalesPerson-Tabelle über deren TerritoryID-Spalten in Betracht. 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 einer vollständigen äußeren Verknüpfung 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 AdventureWorks;
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 ;