クエリオプティマイザは、サブクエリを利用するクエリの多くをジョインとして自動的に書き換えます。変換はユーザによるアクションを必要とすることなく実行されます。この項では、データベースでのクエリのパフォーマンスを理解できるように、どのサブクエリがジョインに変換できるのかを説明します。
マルチレベルのクエリをジョインで作成するために満たす必要がある基準は、演算子のタイプ、クエリの構造、サブクエリの構造によって異なります。サブクエリが 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 に続くサブクエリ
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |