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 の使用法 » データのクエリと変更 » サブクエリの使用

 

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

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

マルチレベルのクエリをジョインで作成するために満たす必要がある基準は、演算子のタイプ、クエリの構造、サブクエリの構造によって異なります。サブクエリが 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 のレコードだけを返します。

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

サブクエリは有効でも、ジョインが有効でない場合があります。次に例を示します。

SELECT Name, Description, Quantity
FROM Products
WHERE Quantity <  2 * (
   SELECT AVG( Quantity )
   FROM SalesOrderItems );
Name Description Quantity
Tee Shirt Tank Top 28
Baseball Cap Wool cap 12
Visor Cloth Visor 36
... ... ...

この場合、内部クエリは集計クエリで外部クエリは集計クエリではないので、2 つのクエリを簡単なジョインで組み合わせることはできません。

参照

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