尽管您通常在 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 |
该查询的执行过程如下:
子查询计算 sales_order_items 表中各产品的平均数量。
主查询然后遍历 product 表,计算产品平均数量,并且按产品名分组。
HAVING 子句然后检查每一平均数量是否超过子查询所找到的数量的两倍。如果超过两倍,则主查询返回该行组;否则,它不返回行组。
SELECT 子句为每一组生成一个摘要行,并且显示每一产品的名称及其库存平均数量。
如下例所示,您也可以在 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 相对应。
SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。