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

 

跟在比较运算符之后的子查询

跟在比较运算符(=、>、<、>=、<=、!=、<>、!>、!<)之后的子查询称为比较。如果这些子查询满足以下条件,则优化程序会将其转换为连接:

  • 对于主查询的每一行只返回一个值。

  • 不包含 GROUP BY 子句

  • 不包含关键字 DISTINCT

  • 不是 UNION 查询

  • 不是汇总查询

示例

假设 "Suresh 的产品是何时订购的,是通过哪一个销售代表订购的?" 这一请求被表示为以下子查询

SELECT OrderDate, SalesRepresentative
FROM SalesOrders
WHERE CustomerID = (
   SELECT ID
   FROM Customers
   WHERE GivenName = 'Suresh' );

此查询满足上述条件,因此可转换为使用连接的查询:

SELECT OrderDate, SalesRepresentative
FROM SalesOrders, Customers
WHERE CustomerID=Customers.ID AND 
  ( Surname = 'Clarke' OR GivenName = 'Suresh' );

不过,"查找其库存量小于平均订购量的两倍的产品" 这一请求无法转换为连接,因为该子查询包含集合函数 AVG:

SELECT Name, Description
FROM Products
WHERE Quantity <  2 * (
   SELECT AVG( Quantity )
   FROM SalesOrderItems );