サブクエリ比較テストとセット・メンバシップ・テストに使用されるサブクエリは、いずれもサブクエリ・テーブルからデータ値を返します。しかし、場合によっては、どの結果をサブクエリが返すのかではなく、サブクエリが何らかの結果を返すのかどうかが重要であることがあります。存在テスト (EXISTS) は、サブクエリがクエリ結果のローを生成するかどうかを調べます。サブクエリが 1 つ以上の結果のローを返す場合、EXISTS テストは TRUE を返します。結果のローを返さない場合は、FALSE を返します。
ここでは、「2001 年 7 月 13 日以降に発注したのはどの顧客か」という要求を、サブクエリを使って表現してみます。
SELECT GivenName, Surname FROM Customers WHERE EXISTS ( SELECT * FROM SalesOrders WHERE ( OrderDate > '2001-07-13' ) AND ( Customers.ID = SalesOrders.CustomerID ) ); |
GivenName | Surname |
---|---|
Almen | de Joie |
Grover | Pendelton |
Ling Ling | Andrews |
Bubba | Murphy |
この例では、サブクエリが、Customers テーブルのローごとに、その顧客 ID が 2001 年 7 月 13 日より後に発注した顧客 ID に対応するかどうかを調べます。対応していれば、クエリはその顧客の姓と名前をメイン・テーブルから抽出します。
EXISTS テストはサブクエリの結果を使用しません。単にサブクエリがローを生成するかどうかを調べるだけです。このため、次の 2 つのサブクエリに適用した存在テストでも同じ結果が返されます。これらはサブクエリですから、それ自体では処理できません。サブクエリが参照する Customers テーブルは、メイン・クエリの一部であってサブクエリの一部ではないからです。
詳細については、相関サブクエリと非相関サブクエリを参照してください。
SELECT * FROM Customers, SalesOrders WHERE ( OrderDate > '2001-07-13' ) AND ( Customers.ID = SalesOrders.CustomerID ) SELECT OrderDate FROM Customers, SalesOrders WHERE ( OrderDate > '2001-07-13' ) AND ( Customers.ID = SalesOrders.CustomerID ); |
便宜上、"SELECT *" という表記を使用していますが、SalesOrders テーブルのどのカラムが SELECT 文に指定されるかどうかは問題ではありません。
EXISTS テストの論理は、NOT EXISTS という形式で否定できます。この場合、テストはサブクエリがローを返さない場合に TRUE を、ローを返す場合に FALSE を返します。
サブクエリには Customers テーブルからの ID カラムへの参照が含まれています。メイン・テーブル内のカラムや式への参照は、「外部参照」と呼ばれます。また、そのサブクエリは「相関」であるといいます。概念的には、SQL は Customers テーブルを調べ、顧客ごとにサブクエリを実行して、前述のクエリを処理します。SalesOrders テーブルの注文日が 2001 年 7 月 13 日より後で、Customers テーブルと SalesOrders テーブルの顧客 ID が一致していれば、Customers テーブルからの姓と名前が表示されます。サブクエリはメイン・クエリを参照するので、この項のサブクエリは、前述の項のサブクエリとは異なり、サブクエリをそれだけで実行しようとするとエラーが返されます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |