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 の使用法 » データのクエリと変更 » サブクエリの使用 » オプティマイザによるサブクエリからジョインへの自動変換

 

ANY、ALL、または SOME に続くサブクエリ

キーワード 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 );
ANY と ALL 演算子を使用するサブクエリの否定

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 )
ANY と ALL の否定

一般に、次の 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
= <>
< =>
> =<
=< >
=> <
<> =