与 SQL Anywhere 支持的语法相比,SQL/2008 标准在语法方面的限制相当多。在 SQL/2008 标准中,对 GROUP BY 的要求如下:
GROUP BY 子句中指定的每一个 group-by-term 都必须是列引用:也就是对在查询的 FROM 子句中引用的表中的列的引用。这些表达式称为分组列。
SELECT 列表、HAVING 子句或 ORDER BY 子句中的表达式如果不是集合函数,则必须是分组列,或者只能引用分组列。但是,如果支持可选的 SQL/2008 语言功能 T301 "功能依赖性",则此类引用可以引用查询的 FROM 子句中由分组列的函数来确定的列。
在 SQL Anywhere 中的 GROUP BY 子句内,group-by-term 可以是包括列引用、文字常量、变量或主机变量,以及标量和用户定义函数的任意表达式。例如,此查询根据 Salary 列将 Employee 表分成三组,每组生成一行:
SELECT COUNT() FROM Employees GROUP BY ( IF SALARY < 25000 THEN 'low range' ELSE IF Salary < 50000 THEN 'mid range' ELSE 'high range' ENDIF ENDIF); |
要使查询结果中包括分区值,必须将 group-by-term 添加到查询 SELECT 列表中。为了在语法上有效,SQL Anywhere 确保 SELECT 列表项的语法与 group-by-term 相同。但是,在语法上大的 SQL 结构会导致此分析失败;而且,比较包含子查询的表达式时从不相等。
在下面的示例中,SQL Anywhere 检测到两个 IF 表达式相等,并计算结果,但未产生错误:
SELECT (IF SALARY < 25000 THEN 'low range' ELSE IF Salary < 50000 THEN 'mid range' ELSE 'high range' ENDIF ENDIF), COUNT() FROM Employees GROUP BY (IF SALARY < 25000 THEN 'low range' ELSE IF Salary < 50000 THEN 'mid range' ELSE 'high range' ENDIF ENDIF); |
但是,以下在 GROUP BY 子句中包含子查询的查询会返回错误:
SELECT (Select State from Employees e WHERE e.EmployeeID = e2.EmployeeID), COUNT() FROM Employees e2 GROUP BY (Select State from Employees e WHERE EmployeeID = e2.EmployeeID) |
更精确的方法是为 SELECT 列表表达式赋予别名,并在 GROUP BY 子句中引用该别名。使用别名允许 SELECT 列表和 GROUP BY 子句包含相关子查询。这种使用 SELECT 列表别名的方法是服务商扩充:
SELECT ( IF SALARY < 25000 THEN 'low range' ELSE IF Salary < 50000 THEN 'mid range' ELSE 'high range' ENDIF ENDIF) AS Salary_range, COUNT() FROM Employees GROUP BY Salary_Range; |
虽然 SQL Anywhere 不支持 SQL/2008 语言功能 T301(功能依赖性)的所有方面,但 SQL Anywhere 确实提供一些对基于 GROUP BY 条件的派生值的支持。SQL Anywhere 支持的 SELECT 列表表达式可引用 GROUP BY 条件、文字常量和(主机)变量,还可以使用可能修改这些值的标量函数。例如,以下查询按城市/州组合列出雇员数:
SELECT City || ' ' || State, SUBSTRING(City,1,3), COUNT() FROM Employees GROUP BY City, State |
有关使用 SQL Anywhere 集合函数的更多标准遵从性信息,请参见集合函数和外部引用。
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |