where子句和group by:
(此段来自Chapter 3: Using Aggregates, Grouping, and Sorting)
你可以把where子句和group by一起使用。在执行任何分组操作之前,任何不满足where子句条件的行会首先被去除。
select type, avg(price) from titles where advance > 5000 group by type type ------------- -------- business 2.99 mod_cook 2.99 popular_comp 21.48 psychology 14.30 trad_cook 17.97 (5 rows affected)
只有组中包含有advances值超过$5000的行才会被作为结果输出。
Adaptive Server处理select列表中的额外列的方式和where子句看起来有些矛盾。例如:
select type, advance, avg(price) from titles where advance > 5000 group by type type advance ------------- --------- -------- business 5,000.00 2.99 business 5,000.00 2.99 business 10,125.00 2.99 business 5,000.00 2.99 mod_cook 0.00 2.99 mod_cook 15,000.00 2.99 popular_comp 7,000.00 21.48 popular_comp 8,000.00 21.48 popular_comp NULL 21.48 psychology 7,000.00 14.30 psychology 2,275.00 14.30 psychology 6,000.00 14.30 psychology 2,000.00 14.30 psychology 4,000.00 14.30 trad_cook 7,000.00 17.97 trad_cook 4,000.00 17.97 trad_cook 8,000.00 17.97 (17 rows affected)
在检查结果中的advance(扩展的)列时,看起来就象这个查询忽略了where子句似的。Adaptive Server仍然会在聚合函数中只计算满足where子句的列,但它也会显示出包含在select列表中的扩展列的表中所有行。为了进一步限制结果中这些行的显示,可以使用having子句,可查看“选择组中的数据:having子句”。
上面是Sybase的SQL指南中的相关片段。
Sybase的Interactive SQL工具的报错:
对于上述select语句中where和group by子句的执行次序,想来可以在查询计划中找到相关信息。但在Sybase客户端15版本的Interactive SQL工具(dbisql)中,在菜单项中选择计划查看器时却屡屡报错。查看错误信息:
java.util.MissingResourceException: Can't find resource for bundle com.sybase.aseisqlplugin.ASEBundle, key PLAN_RETRIEVAL_ERROR at java.util.ResourceBundle.getObject(ResourceBundle.java:384) at java.util.ResourceBundle.getString(ResourceBundle.java:344) at com.sybase.aseisqlplugin.ASEBundleBase.getFormattedString(ASEBundleBase.java:115) at com.sybase.aseisqlplugin.ASEPlanViewer.showPlan(ASEPlanViewer.java:80)
看错误日志后面的系统变量信息,执行时所用的java运行环境是此版本Sybase客户端自带的Java 1.6,aseisqlplugin.jar也在正确目录下存在,且dbisql.rep文件中的类路径的配置也正常。为何报这个错误呢?查来查去找不到原因。好在命令行方式打开查询计划还是可用的:
set showplan on set noexec on go select 语句 go set showplan off set noexec off go
暂时就这么用着吧。
原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/1871.html