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 的用法 » 查询和修改数据 » 使用子查询

 

HAVING 子句中的子查询

尽管您通常在 WHERE 子句中使用子查询作为搜索条件,但有时也可以在查询的 HAVING 子句中使用子查询。当子查询出现在 HAVING 子句中时,像 HAVING 子句中的任何表达式一样,它被用作行组选择的一部分。

下面的请求通过在 HAVING 子句中使用子查询来满足查询条件:"哪些产品的平均库存数量超过了每个客户订购的每个产品平均数量的两倍?"

示例
SELECT Name, AVG( Quantity )
FROM Products
GROUP BY Name
HAVING AVG( Quantity ) > 2* (
   SELECT AVG( Quantity )
   FROM SalesOrderItems 
 );
name AVG( Products.Quantity )
Baseball Cap 62.000000
Shorts 80.000000
Tee Shirt 52.333333

该查询的执行过程如下:

  • 该子查询计算 SalesOrderItems 表中各产品的平均数量。

  • 接着主查询遍历 Products 表,计算每种产品的平均数量,并将它们按产品名分组。

  • HAVING 子句随后检查每一平均数量是否超过了子查询所找到的数量的两倍。如果是这样,则主查询返回该行组;否则,将不返回该行组。

  • SELECT 子句为每一组生成一个摘要行,并且显示每一产品的名称及其库存平均数量。

如下例所示,您也可以在 HAVING 子句中使用外部引用,但与前一个例子稍有不同。

示例

此示例查找平均订购数量超过库存数量一半的那些产品的产品 ID 号和行 ID 号。

SELECT ProductID, LineID
FROM SalesOrderItems
GROUP BY ProductID, LineID
HAVING 2* AVG( Quantity ) > (
   SELECT Quantity
   FROM Products
   WHERE Products.ID = SalesOrderItems.ProductID );
ProductID LineID
601 3
601 2
601 1
600 2
... ...

在此示例中,子查询必须生成与 HAVING 子句所测试的行组相对应的产品的库存量。子查询使用外部引用 SalesOrderItems.ProductID 来选择该特定产品的记录。

使用比较符号的子查询返回单个值

此查询使用比较运算符 >,暗示该子查询必须只返回一个值。在此例中,它恰好返回了一个值。由于 Products 表的 ID 字段是主键,因此 Products 表中只有一条记录与任何特定产品 ID 相对应。