Verwenden von Selbstverknüpfungen

Eine Tabelle kann in einer Selbstverknüpfung mit sich selbst verknüpft werden. Sie verwenden eine Selbstverknüpfung, wenn Sie ein Resultset erstellen möchten, durch das Datensätze in einer Tabelle mit anderen Datensätzen in der gleichen Tabelle verknüpft werden. Um eine Tabelle zweimal in der gleichen Abfrage aufzulisten, müssen Sie einen Tabellenalias für mindestens eine Instanz des Tabellennamens bereitstellen. Mithilfe dieses Tabellenalias kann der Abfrageprozessor bestimmen, ob in Spalten Daten aus der rechten oder linken Version der Tabelle dargestellt werden sollen.

Beispiele

A. Verwenden einer Selbstverknüpfung, um Produkte mehrerer Hersteller zu finden

Im folgenden Beispiel wird eine Selbstverknüpfung für die Suche nach Produkten verwendet, die von mehreren Herstellern geliefert werden.

Da diese Abfrage eine Verknüpfung der ProductVendor-Tabelle mit sich selbst beinhaltet, tritt die ProductVendor-Tabelle in zwei Rollen auf. Um diese Rollen zu unterscheiden, müssen Sie der ProductVendor-Tabelle in der FROM-Klausel zwei verschiedene Aliasnamen (pv1 und pv2) zuordnen. Mit diesen Aliasnamen werden die Spaltennamen im verbleibenden Teil der Abfrage gekennzeichnet. Das folgende Beispiel zeigt die Transact-SQL-Anweisung zur Selbstverknüpfung:

USE AdventureWorks;
GO
SELECT DISTINCT pv1.ProductID, pv1.VendorID
FROM Purchasing.ProductVendor pv1
    INNER JOIN Purchasing.ProductVendor pv2
        ON pv1.ProductID = pv2.ProductID
        AND pv1.VendorID <> pv2.VendorID
ORDER BY pv1.ProductID

B. Verwenden einer Selbstverknüpfung für die Zuordnung von Mitarbeitern und Vorgesetzten

Im folgenden Beispiel wird eine Selbstverknüpfung der Tabelle HumanResources.Employee ausgeführt, um eine Liste aller Vorgesetzten und der ihnen unterstellten Mitarbeiter zu erstellen.

SELECT MgrTable.LoginID AS ManagerName,EmplTable.ManagerID, 
    EmplTable.LoginID, EmplTable.EmployeeID
FROM HumanResources.Employee AS EmplTable
    JOIN HumanResources.Employee AS MgrTable
        ON EmplTable.ManagerID = MgrTable.EmployeeID
ORDER BY MgrTable.LoginID, EmplTable.LoginID