从MySQL转到Oracle之后,group by 变成了我的另外一个噩梦。曾经多么好用的group by, 虽然与distinct作用类似,但是由于在SQL语句位置的不同,可以轻松的得到很多难缠问题的解法。但是在Oracle里面硬生生的变成了一个鸡肋。
在MySQL里面group by 可以随心所欲的在任何场合使用,比如单表查询时:
select id,name,addr from table1 group by addr
或者多表查询时:
select t1.id, t2.name,t2.addr as addr from table1 as t1, table2 as t2 where t1.id=t2.id group by addr
但是这样的写法在oracle里面就会报错,并非因为上一篇提到的as 用法的差异,而是oracle 对group by 用法的苛刻要求。
这里有个英文网页告诉我们
oracle 要求使用group by 时必须与下列统计函数一起使用
AVG
COUNT
FIRST
LAST
MAX
MIN
STDDEV
SUM
VARIANCE
比如
select addr,count(*) from table1 group by addr
列出的结果会对相同的addr字段数据技术
但是,我发现这样写也会报错
select addr,count(*),name from table1 group by addr
当然逻辑上讲,addr一致的时候,不能保证name一致,所以oracle不能判断怎么显示name,所以报错(MySQL能显示第一个找到的name数据),如果一定要写,只能这么写,
select addr,count(*),count(name) from table1 group by addr
当然我看不出这么写还有这么意义。
我找不到一个总结oracle group by 用法的中文网页,如果你也遇到相同的困扰,上面提到的一个英文网页也许能帮到你:http://www.psoug.org/reference/group_by.html
如果你也总结了oracle group by 的用法,希望你不吝于我分享。
本文为寻找人生的起点(http://blog.cn-ic.org)原创,如需转载,请注明出处,并保留原文链接 http://blog.cn-ic.org/?p=83。