内部結合の使用

内部結合では、比較演算子を使用して結合対象の列の値が比較されます。

ISO 規格では、内部結合は FROM 句でも WHERE 句でも指定できます。ISO の場合、WHERE 句では内部結合だけがサポートされます。WHERE 句で指定する内部結合を旧形式の内部結合と呼びます。

次の Transact-SQL クエリは、内部結合の例です。

USE AdventureWorks;
GO
SELECT *
FROM HumanResources.Employee AS e
    INNER JOIN Person.Contact AS c
    ON e.ContactID = c.ContactID
ORDER BY c.LastName

このような内部結合を等結合と呼びます。等結合では、両方のテーブル内のすべての列が返され、その後、結合列の値が等しい行だけが返されます。

等号以外の演算子を使用した結合

2 つの列の値が等しくなくても結合できます。内部結合で使用される演算子と述語は、等結合以外でも使用できます。結合で使用できる演算子と述語の詳細については、「式における演算子の使用」および「WHERE (Transact-SQL)」を参照してください。

次の例では、< (より小さい) 演算子を使用して、商品番号 718 の販売価格から定価よりも安いものを検索しています。

USE AdventureWorks;
GO
SELECT DISTINCT p.ProductID, p.Name, p.ListPrice, sd.UnitPrice AS 'Selling Price'
FROM Sales.SalesOrderDetail AS sd
    JOIN Production.Product AS p 
    ON sd.ProductID = p.ProductID AND sd.UnitPrice < p.ListPrice
WHERE p.ProductID = 718;
GO

以下に結果セットを示します。

ProductID   Name                        ListPrice          Selling Price
----------- --------------------------- ------------------ -------------
718         HL Road Frame - Red, 44     1431.5000          758.0759
718         HL Road Frame - Red, 44     1431.5000          780.8182
718         HL Road Frame - Red, 44     1431.5000          858.90

(3 row(s) affected)

不等号演算子を使用した結合

不等号結合 (<>) はめったに使われません。一般的に、不等号結合が意味を成すのは、自己結合と共に使われる場合のみです。たとえば、次の例では、不等号 Transact-SQL 結合と自己結合を使用して、価格が異なる $15 未満の商品が 2 点以上含まれるサブカテゴリを検索しています。

USE AdventureWorks;
GO
SELECT DISTINCT p1.ProductSubcategoryID, p1.ListPrice
FROM Production.Product p1
    INNER JOIN Production.Product p2
    ON p1.ProductSubcategoryID = p2.ProductSubcategoryID
    AND p1.ListPrice <> p2.ListPrice
WHERE p1.ListPrice < $15 AND p2.ListPrice < $15
ORDER BY ProductSubcategoryID;
注意注意

NOT column_name = column_name という式は、column_name <> column_name と同じです。

次の Transact-SQL の例では、不等号結合と自己結合を組み合わせて使用し、ProductID は同じで VendorID 番号が異なる複数の行 (つまり、複数のベンダが提供している商品) を ProductVendor テーブルからすべて検索しています。

USE AdventureWorks;
GO
SELECT DISTINCT p1.VendorID, p1.ProductID
FROM Purchasing.ProductVendor p1
    INNER JOIN Purchasing.ProductVendor p2
    ON p1.ProductID = p2.ProductID
WHERE p1.VendorID <> p2.VendorID
ORDER BY p1.VendorID