キーワード ALL、ANY、SOME のいずれかに続くサブクエリは、限定比較と呼ばれます。オプティマイザは、次のような場合にこれらのサブクエリをジョインに変換します。
メイン・クエリが GROUP BY 句を含んでおらず、集計クエリでない。または、サブクエリが 1 つの値を返す。
サブクエリが GROUP BY 句を含んでいない。
サブクエリがキーワード DISTINCT を含んでいない。
サブクエリが UNION クエリではない。
サブクエリが集計クエリではない。
'expression comparison-operator { ANY | SOME } ( subquery-expression )' の部分が否定されていない。
'expression comparison-operator ALL ( subquery-expression )' の部分が否定されている。
最初の 4 つの条件は、比較的簡単です。
「Mrs. Clarke と Suresh がいつ注文し、どの担当者が注文を受けたか」という要求は、サブクエリの形式で処理できます。
SELECT OrderDate, SalesRepresentative FROM SalesOrders WHERE CustomerID = ANY ( SELECT ID FROM Customers WHERE Surname = 'Clarke' OR GivenName = 'Suresh' ); |
または、ジョインの形式で表現できます。
SELECT OrderDate, SalesRepresentative FROM SalesOrders, Customers WHERE CustomerID=Customers.ID AND ( Surname = 'Clarke' OR GivenName = 'Suresh' ); |
しかし、「Mrs. Clarke、Suresh、および顧客でもある従業員が、注文したのはいつか」という要求は UNION クエリとして表現されるので、ジョインには変換できません。
SELECT OrderDate, SalesRepresentative FROM SalesOrders WHERE CustomerID = ANY ( SELECT ID FROM Customers WHERE Surname = 'Clarke' OR GivenName = 'Suresh' UNION SELECT EmployeeID FROM Employees ); |
同様に、「すべての製品の最初の出荷日の後に出荷されていない注文の注文 ID と顧客 ID を検索する」という要求は、集計クエリで表現されるため、ジョインに変換できません。
SELECT ID, CustomerID FROM SalesOrders WHERE NOT OrderDate > ALL ( SELECT FIRST ( ShipDate ) FROM SalesOrderItems ORDER BY ShipDate ); |
5 つ目の条件はやや複雑です。次の形式のクエリがジョインに変換されます。
SELECT select-list FROM table WHERE NOT expression comparison-operator ALL ( subquery-expression )
SELECT select-list FROM table WHERE expression comparison-operator ANY ( subquery-expression )
ただし、次のクエリはジョインに変換されません。
SELECT select-list FROM table WHERE expression comparison-operator ALL ( subquery-expression )
SELECT select-list FROM table WHERE NOT expression comparison-operator ANY ( subquery-expression )
最初の 2 つのクエリも、後の 2 つのクエリも、それぞれ同等です。すでに説明したように、ANY 演算子は OR 演算子と似ていますが、引数の数が異なります。同様に、ALL 演算子は AND 演算子に似ています。たとえば、次の 2 つの式は同等です。
NOT ( ( X > A ) AND ( X > B ) ) ( X <= A ) OR ( X <= B ) |
次の 2 つの式も同等です。
WHERE NOT OrderDate > ALL ( SELECT FIRST ( ShipDate ) FROM SalesOrderItems ORDER BY ShipDate ) |
WHERE OrderDate <= ANY ( SELECT FIRST ( ShipDate ) FROM SalesOrderItems ORDER BY ShipDate ) |
一般に、次の 2 つの式は同等です。
NOT column-name operator ANY ( subquery-expression )
column-name inverse-operator ALL ( subquery-expression )
次の式も、一般に同等です。
NOT column-name operator ALL ( subquery-expression )
column-name inverse-operator ANY ( subquery-expression )
inverse-operator は、次の表に示すように、operator を否定することによって取得されます。
operator | inverse-operator |
---|---|
= | <> |
< | => |
> | =< |
=< | > |
=> | < |
<> | = |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |