自己結合の使用

自己結合を使用すると、テーブルをそのテーブル自体に結合できます。テーブルのレコードを同じテーブルの別のレコードと結合する結果セットを作成する場合は、自己結合を使用します。同じクエリで特定のテーブルを 2 回使用して一覧を作成する場合は、そのテーブル名のインスタンスの少なくとも 1 つにテーブルの別名を指定する必要があります。このテーブルの別名によって、テーブルの右バージョンと左バージョンのどちらのデータを列に表示するかをクエリ プロセッサが決定できるようになります。

A. 自己結合を使用して、複数のベンダから提供されている製品を検索する

次の例では、自己結合を使用して、複数のベンダから提供されている製品を検索します。

次のクエリでは、ProductVendor テーブルの自己結合を使用しているため、ProductVendor テーブルは 2 つのロールで使用されることになります。これらのロールを区別するために、FROM 句では、ProductVendor テーブルに 2 つの異なる別名 (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