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 の使用法 » データの問い合わせと修正 » サブクエリの使用

 

オプティマイザーによるサブクエリからジョインへの自動変換

クエリオプティマイザーは、サブクエリを利用するクエリの多くをジョインとして自動的に書き換えます。変換はユーザーによるアクションを必要とすることなく実行されます。この項では、データベースでのクエリのパフォーマンスを理解できるように、どのサブクエリがジョインに変換できるのかを説明します。

マルチレベルのクエリをジョインで作成するために満たす必要がある基準は、演算子のタイプ、クエリの構造、サブクエリの構造によって異なります。サブクエリが WHERE 句内にある場合は、次の形式になることに注意してください。

SELECT select-list 
FROM table 
WHERE
[NOT] expression comparison-operator ( subquery-expression ) 
| [NOT] expression comparison-operator { ANY | SOME } ( subquery-expression ) 
| [NOT] expression comparison-operator ALL ( subquery-expression ) 
| [NOT] expression IN ( subquery-expression )
| [NOT] EXISTS ( subquery-expression ) 
GROUP BY group-by-expression 
HAVING search-condition

たとえば、「Mrs. Clarke と Suresh がいつ注文し、どの担当者が注文を受けたか」という要求を考えてみます。これは次のクエリを使用して回答できます。

SELECT OrderDate, SalesRepresentative
FROM SalesOrders
WHERE CustomerID IN (
   SELECT ID
   FROM Customers
   WHERE Surname = 'Clarke' OR GivenName = 'Suresh' );
OrderDate SalesRepresentative
2001-01-05 1596
2000-01-27 667
2000-11-11 467
2001-02-04 195
... ...

サブクエリは WHERE 句に名前がリストされている 2 人の顧客に対応する顧客 ID のリストを生成します。メインクエリはこの 2 人の注文に対応する注文日と担当者を検索します。

同じ問い合わせをジョインを使用して応答できます。このクエリの、2 つのテーブルのジョインを使用した代替形式を次に示します。

SELECT OrderDate, SalesRepresentative
FROM SalesOrders, Customers
WHERE CustomerID=Customers.ID AND
  ( Surname = 'Clarke' OR GivenName = 'Suresh' );

この形式のクエリは SalesOrders テーブルを Customers テーブルにジョインして各顧客の注文を検索し、Suresh と Clarke のレコードだけを返します。

 サブクエリは有効でもジョインが有効でない場合
 参照

比較演算子に続くサブクエリ
ANY、ALL、または SOME に続くサブクエリ
IN に続くサブクエリ
EXISTS に続くサブクエリ