内部結合の使用
内部結合では、比較演算子を使用して結合対象の列の値が比較されます。
ISO 規格では、内部結合は FROM 句でも WHERE 句でも指定できます。ISO の場合、WHERE 句では内部結合だけがサポートされます。WHERE 句で指定する内部結合を旧形式の内部結合と呼びます。
次の Transact-SQL クエリは、内部結合の例です。
USE AdventureWorks2008R2;
GO
SELECT *
FROM HumanResources.Employee AS e
INNER JOIN Person.Person AS p
ON e.BusinessEntityID = p.BusinessEntityID
ORDER BY p.LastName
このような内部結合を等結合と呼びます。等結合では、両方のテーブル内のすべての列が返され、その後、結合列の値が等しい行だけが返されます。
等号以外の演算子を使用した結合
2 つの列の値が等しくなくても結合できます。内部結合で使用される演算子と述語は、等結合以外でも使用できます。結合で使用できる演算子と述語の詳細については、「式における演算子の使用」および「WHERE (Transact-SQL)」を参照してください。
次の例では、< (より小さい) 演算子を使用して、商品番号 718 の販売価格から定価よりも安いものを検索しています。
USE AdventureWorks2008R2;
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 行処理されました)
不等号演算子を使用した結合
不等号結合 (<>) はめったに使われません。一般的に、不等号結合が意味を成すのは、自己結合と共に使われる場合のみです。たとえば、次の例では、不等号 Transact-SQL 結合と自己結合を使用して、価格が異なる $15 未満の商品が 2 点以上含まれるサブカテゴリを検索しています。
USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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