Collection Contents 上一页 下一页 PDF

ASA SQL 用户指南

使用子查询

HAVING 子句中的子查询


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

下面的请求很自然地产生了一个在 HAVING 子句中使用子查询的查询:[库存数量中哪些产品的平均数量超过每个客户订购的每一产品的平均数量的两倍?]

示例 
SELECT name, avg(quantity)
FROM product
GROUP BY name
HAVING avg(quantity) > 2* (
   SELECT avg(quantity)
   FROM sales_order_items
   )
name avg(product.quantity)
Tee Shirt 52.333333
Baseball Cap 62
Shorts 80

该查询的执行过程如下:

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

示例 

[查找其平均订购数量超过这些产品的库存数量的一半的那些产品的产品 ID 号和行 ID 号。]

SELECT prod_id, line_id
FROM sales_order_items
GROUP BY prod_id, line_id
HAVING 2* avg(quantity) > (
   SELECT quantity
   FROM product
   WHERE product.id = sales_order_items.prod_id)
prod_id line_id
401 2
401 1
401 4
501 3
... ...

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

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

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


子查询测试

Collection Contents 上一页 下一页 PDF