使用自联接

表可以通过自联接与自身联接。要创建将某个表中的记录与同一表中的其他记录相联接的结果集时,使用自联接。若要在同一查询中两次列出某个表,必须至少为该表名称的一个实例提供表别名。此表别名帮助查询处理器确定列应从表的右边还是左边样式呈现数据。

示例

A. 使用自联接查找由多个供应商提供的产品

下面的示例使用自联接查找由多个供应商提供的产品。

由于此查询涉及 ProductVendor 表与其自身的联接,因此 ProductVendor 表将以两种角色出现。若要区分这两种角色,必须在 FROM 子句中为 ProductVendor 表给定两个不同的别名(pv1 和 pv2)。这些别名用于限定查询其余部分中的列名。下面是自联接 Transact-SQL 语句示例:

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. 使用自联接匹配雇员及其经理

下面的示例执行 HumanResources.Employee 表的自联接,以生成所有经理以及下属雇员的列表。

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