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

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » データの問い合わせと修正 » サブクエリの使用

 

相関サブクエリと非相関サブクエリ

サブクエリには、親の文に定義されたオブジェクトへの参照を含めることができます。このことは「外部参照」と呼ばれます。外部参照があるサブクエリは「相関サブクエリ」と呼ばれます。相関サブクエリは、外部クエリとは別に評価することはできません。これは、サブクエリが親の文の値を使用するためです。つまり、サブクエリは親の文のローごとに実行されます。したがって、サブクエリの結果は、親の文で評価されるアクティブなローに依存します。

たとえば、次の文のサブクエリは、Products テーブル内のアクティブなローに依存する値を返します。

SELECT Name, Description
FROM Products
WHERE Quantity < 2 * (
   SELECT AVG( Quantity )
   FROM SalesOrderItems
   WHERE Products.ID=SalesOrderItems.ProductID );

この例では、このサブクエリの Products.ID カラムは外部参照です。このクエリは、在庫数が平均注文数の 2 倍より少ない製品、具体的には、メインクエリの WHERE 句によってテストされている製品の、名前と説明を抽出します。サブクエリは SalesOrderItems テーブルをスキャンしてこれを実行します。しかし、サブクエリの WHERE 句にある Products.ID カラムは、サブクエリではなく、メインクエリの FROM 句に指定されているテーブルのカラムを参照します。データベースサーバーは Products テーブルの各ローの間を移動して、サブクエリの WHERE 句を評価するときに、現在のローの ID 値を使用します。

サブクエリで参照されるカラムが、サブクエリの FROM 句で参照されるテーブルになくても、外部クエリの FROM 句で参照されるテーブルにあれば、クエリはエラーなく実行されます。SQL Anywhere では、サブクエリのカラムが外部クエリのテーブル名で暗黙的に修飾されます。

親の文にオブジェクトへの参照を含まないサブクエリを、「非相関サブクエリ」と呼びます。次の例では、サブクエリは正確に 1 つの値、SalesOrderItems テーブルの平均数を計算します。クエリを評価するときに、データベースサーバーはこの値を一度計算し、その値を Products テーブルの Quantity フィールドにあるそれぞれの値と比較して、対応するローを選択するかどうかを決定します。

SELECT Name, Description
FROM Products
WHERE Quantity <  2 * (
   SELECT AVG( Quantity )
   FROM SalesOrderItems );