跟在比较运算符(=、>、<、>=、<=、!=、<>、!>、!<)之后的子查询称为比较。如果这些子查询满足以下条件,则优化程序会将其转换为连接:
对于主查询的每一行只返回一个值。
不包含 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 ); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |