IN で導かれるサブクエリ
IN または NOT IN で導かれたサブクエリの結果は、0 個以上の値のリストになります。サブクエリが結果を返すと、1 つ上のレベルのクエリがこの結果を使用します。
次のクエリでは、Adventure Works Cycles が製造しているすべてのホイール製品の名前が検索されます。
USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
(SELECT ProductSubcategoryID
FROM Production.ProductSubcategory
WHERE Name = 'Wheels');
次に結果セットを示します。
Name
----------------------------
LL Mountain Front Wheel
ML Mountain Front Wheel
HL Mountain Front Wheel
LL Road Front Wheel
ML Road Front Wheel
HL Road Front Wheel
Touring Front Wheel
LL Mountain Rear Wheel
ML Mountain Rear Wheel
HL Mountain Rear Wheel
LL Road Rear Wheel
ML Road Rear Wheel
HL Road Rear Wheel
Touring Rear Wheel
(14 行処理されました)
このステートメントは、2 段階で評価されます。まず、内側のクエリが名前 "Wheel" と一致するサブカテゴリの ID 番号 (17) を返します。次に、この値が 1 つ上のレベルのクエリに代入され、1 つ上のレベルのクエリがサブカテゴリの ID 番号に対応する製品名を Product の中から検索します。
USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN ('17');
この例やこれに似た問題に対して、サブクエリではなく結合を使用すると、1 つの違いが生じます。結合では、複数のテーブルの列が結果に表示されます。たとえば、製品のサブカテゴリ名を結果に含めるには、次のような結合を使う必要があります。
Use AdventureWorks2008R2;
GO
SELECT p.Name, s.Name
FROM Production.Product p
INNER JOIN Production.ProductSubcategory s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
AND s.Name = 'Wheels';
次に結果セットを示します。
Name Name
LL Mountain Front Wheel Wheels
ML Mountain Front Wheel Wheels
HL Mountain Front Wheel Wheels
LL Road Front Wheel Wheels
ML Road Front Wheel Wheels
HL Road Front Wheel Wheels
Touring Front Wheel Wheels
LL Mountain Rear Wheel Wheels
ML Mountain Rear Wheel Wheels
HL Mountain Rear Wheel Wheels
LL Road Rear Wheel Wheels
ML Road Rear Wheel Wheels
HL Road Rear Wheel Wheels
Touring Rear Wheel Wheels
(14 行処理されました)
次のクエリは、信用格付けが高く、Adventure Works Cycles が少なくとも 20 種類の商品を仕入れていて、納品までの期間が平均で 16 日未満のベンダーの名前を検索します。
Use AdventureWorks2008R2;
GO
SELECT Name
FROM Purchasing.Vendor
WHERE CreditRating = 1
AND BusinessEntityID IN
(SELECT BusinessEntityID
FROM Purchasing.ProductVendor
WHERE MinOrderQty >= 20
AND AverageLeadTime < 16);
次に結果セットを示します。
Name
--------------------------------------------------
Compete Enterprises, Inc
International Trek Center
First National Sport Co.
Comfort Road Bicycles
Circuit Cycles
First Rate Bicycles
Jeff's Sporting Goods
Competition Bike Training Systems
Electronic Bike Repair & Supplies
Crowley Sport
Expert Bike Co
Team Athletic Co.
Compete, Inc.
(13 行処理されました)
まず、内側のクエリが評価され、サブクエリの条件を満たすベンダーの ID 番号が返されます。次に、1 つ上のレベルのクエリが評価されます。内側のクエリと 1 つ上のレベルのクエリ両方の WHERE 句に複数の条件を含めることができることに注意してください。
結合を使うと、上記のクエリは次のように表されます。
USE AdventureWorks2008R2;
GO
SELECT DISTINCT Name
FROM Purchasing.Vendor v
INNER JOIN Purchasing.ProductVendor p
ON v.BusinessEntityID = p.BusinessEntityID
WHERE CreditRating = 1
AND MinOrderQty >= 20
AND AverageLeadTime < 16;
結合は常にサブクエリとして表すことができます。サブクエリは、多くの場合、結合として表すことができますが、常に表せるわけではありません。これは、結合に対照性があるためです。つまり、テーブル A とテーブル B をどのような順序で結合しても、得られる答えは同じになります。サブクエリを使った場合、同じことが当てはまりません。