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 的用法 » 查询和修改数据 » 使用子查询 » 优化程序自动将子查询转换为连接

 

跟在 EXISTS 之后的子查询

仅当满足以下条件时,优化程序才会对跟在 EXISTS 关键字之后的子查询进行转换:

  • 主查询不包含 GROUP BY 子句,并且不是集合查询,或子查询只返回一个值。

  • 联合 [EXISTS(子查询)] 不被取非。

  • 该子查询是相关的;即,它包含外部引用。

示例

"哪些客户在 2001 年 7 月 13 日之后下了订单?" 这一请求可使用这样的查询来表示,该查询未取非的子查询包含外部引用 Customers.ID = SalesOrders.CustomerID,因此可以使用以下连接来表示:

SELECT GivenName, Surname
FROM Customers
WHERE EXISTS (
   SELECT *
   FROM SalesOrders
   WHERE ( OrderDate > '2001-07-13' ) AND
         ( Customers.ID = SalesOrders.CustomerID ) );

EXISTS 关键字用于指示数据库服务器检查是否存在空结果集。在使用内连接时,数据库服务器只自动显示这样的行:这些行的数据来自 FROM 子句中的所有表。因此,此查询返回的行与以下具有子查询的查询所返回的行相同:

SELECT DISTINCT GivenName, Surname
FROM Customers, SalesOrders
WHERE ( SalesOrders.OrderDate > '2001-07-13' ) AND 
      ( Customers.ID = SalesOrders.CustomerID );