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 的用法 » 查询和修改数据 » OLAP 支持 » SQL Anywhere 中的窗口函数 » 基本集合函数

 

MAX 函数示例

消除相关子查询

在某些情况下,可能需要具备将特定列值与最大或最小值进行比较的能力。通常会以涉及相关属性的嵌套查询(也称为外部引用)的形式来构成这些查询。例如,请考虑以下查询,该查询列出包括产品信息的所有订单,其中现有产品数量不能包括该产品最大的单个订单量:

SELECT o.ID, o.OrderDate, p.*
FROM SalesOrders o, SalesOrderItems s, Products p
WHERE o.ID = s.ID AND s.ProductID = p.ID
       AND p.Quantity < ( SELECT MAX( s2.Quantity )
                         FROM SalesOrderItems s2
                         WHERE s2.ProductID = p.ID )
ORDER BY p.ID, o.ID;

此查询的图形式计划显示在 [计划查看器] 中,如下所示。注意查询优化程序如何将此嵌套查询转换成带有派生表的 Products 和 SalesOrders 表的连接,该派生表由相关名 DT 表示,它包含窗口函数。

图形式计划

最好不依赖于优化程序将相关子查询转换成带有派生表的连接—这种方法由于语义分析的复杂性而仅能在简单情况下实现—您可以使用窗口函数来构成此类查询:

SELECT order_qty.ID, o.OrderDate, p.*
  FROM ( SELECT s.ID, s.ProductID,
           MAX( s.Quantity ) OVER ( 
             PARTITION BY s.ProductID
             ORDER BY s.ProductID ) 
           AS max_q
           FROM SalesOrderItems s )
  AS order_qty, Products p, SalesOrders o
  WHERE p.ID = ProductID 
    AND o.ID = order_qty.ID 
    AND p.Quantity < max_q
  ORDER BY p.ID, o.ID;
另请参见