比較演算子によるサブクエリ
サブクエリは、比較演算子 =、< >、>、> =、<、! >、! <、または < = のいずれかで導くことができます。
修飾されていない比較演算子 (後ろに ANY や ALL がない比較演算子) で導かれるサブクエリでは、IN によって導かれるサブクエリと同様に、値のリストでなく単一の値を返す必要があります。このようなサブクエリから、複数の値が返された場合、Microsoft SQL Server 2005 によりエラーメッセージが表示されます。
修飾されていない比較演算子で導かれるサブクエリを使用するには、データや問題の性質を十分に理解して、そのサブクエリで値が 1 つしか返されないことを把握しておく必要があります。
たとえば、販売員 1 人が 1 販売区域を担当すると仮定した場合に、Linda Mitchell が担当する区域の顧客を検索するには、次のように単純な = 比較演算子を使用したステートメントを作成できます。
USE AdventureWorks;
GO
SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID =
(SELECT TerritoryID
FROM Sales.SalesPerson
WHERE SalesPersonID = 276)
ただし、Linda Mitchell が複数の販売区域を担当している場合は、エラー メッセージが返されます。この場合、比較演算子 = の代わりに IN 式または = ANY を使用することができます。
集計関数は単一の値を返すため、多くの場合、修飾されていない比較演算子で導かれるサブクエリには、集計関数が含まれます。たとえば、次のステートメントでは、表示価格が平均表示価格よりも高いすべての製品の名前が検索されます。
Use AdventureWorks
SELECT Name
FROM Production.Product
WHERE ListPrice >
(SELECT AVG (ListPrice)
FROM Production.Product)
修飾されていない比較演算子で導かれるサブクエリでは単一の値を返す必要があるため、GROUP BY 句や HAVING 句を含めることはできません。 ただし、GROUP BY 句や HAVING 句が単一の値を返すことがわかっている場合は例外です。たとえば、次のクエリでは、サブカテゴリが 14 の製品で、最低価格の製品より高い価格の付けられた製品が検索されます。
Use AdventureWorks
SELECT Name
FROM Production.Product
WHERE ListPrice >
(SELECT MIN (ListPrice)
FROM Production.Product
GROUP BY ProductSubcategoryID
HAVING ProductSubcategoryID = 14)