EXISTS を使ったサブクエリ

サブクエリの導入にキーワード EXISTS を使用した場合、そのサブクエリは存在検査として機能します。外側のクエリの WHERE 句により、このサブクエリから返される行が存在するかどうかがテストされます。サブクエリは実際にはデータを生成せず、TRUE または FALSE の値を返します。

EXISTS を使用して導入するサブクエリの構文は、次のとおりです。

WHERE [NOT] EXISTS (subquery)

次のクエリは、Wheels サブカテゴリに属するすべての製品の名前を検出します。

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE EXISTS
    (SELECT * 
     FROM Production.ProductSubcategory
     WHERE ProductSubcategoryID = 
            Production.Product.ProductSubcategoryID
        AND 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 row(s) affected)

このクエリの結果を理解するには、各製品の名前を順番に考察してください。この値があるとき、サブクエリから 1 行以上が返されるでしょうか。つまり、存在検査は TRUE と評価されるでしょうか。

EXISTS を使用して導入するサブクエリは、他のサブクエリとは次の点で少し違うことに注意してください。

  • キーワード EXISTS の前に、列名、定数、またはその他の式は配置されません。
  • ほとんどの場合、EXISTS で導かれたサブクエリの選択リストはアスタリスク (*) で構成されます。サブクエリで指定された条件を満たす行が存在するかどうかを検査するだけなので、列名を指定する理由はありません。

EXISTS キーワードは、代わりに使用できるようなサブクエリ以外の記述形式が存在しない場合が多いので、重要です。EXISTS を使ったクエリの中には他の表現に変えられないものがありますが、多くのクエリでは、IN を使用したり、ANY または ALL で修飾した比較演算子を使用することにより、同じような結果を得ることができます。

たとえば、上記のクエリは IN を使用して表現できます。

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
    (SELECT ProductSubcategoryID
     FROM Production.ProductSubcategory
     WHERE Name = 'Wheels')

参照

その他の技術情報

EXISTS (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手