Share via


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 をどのような順序で結合しても、得られる答えは同じになります。サブクエリを使った場合、同じことが当てはまりません。

関連項目

概念