Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データのクエリと変更 » サブクエリの使用 » サブクエリのテスト

 

サブクエリと EXISTS テスト

サブクエリ比較テストとセット・メンバシップ・テストに使用されるサブクエリは、いずれもサブクエリ・テーブルからデータ値を返します。しかし、場合によっては、どの結果をサブクエリが返すのかではなく、サブクエリが何らかの結果を返すのかどうかが重要であることがあります。存在テスト (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 テーブルからの姓と名前が表示されます。サブクエリはメイン・クエリを参照するので、この項のサブクエリは、前述の項のサブクエリとは異なり、サブクエリをそれだけで実行しようとするとエラーが返されます。