1. 苏葳的备忘录首页
  2. 数据库

Sybase SQL中where子句与group by连用时的困惑

sybase where group by在SQL中,对于select语句里的where子句和group by子句的连用,一般原则应该是先执行where条件过滤,再用group by子句的条件来分组。然而Sybase却有所不同,比如select * from test1 where aa=’1′ group by bb,这是一条简单的分组语句,执行的结果却让人大跌眼镜。好象是where条件根本没有生效一样。查了Sybase文档,才明白问题之所在。现将该节翻译如下:

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

发表评论

邮箱地址不会被公开。 必填项已用*标注