4. 利用CUBE子句求出多列组合汇总结果
(DBA)> select h0,h02,count(*)cnt from rk.hu group by h0,h02;
h0 h02 cnt
---------------------------
1 1
0 1 306826326
1 2 851846
0 2 9890655
1 1 33664871
(5 行)
执行时间: 16.644 秒
(DBA)> select h0,h02,count(*)cnt from rk.hu group by cube(h0,h02);
h0 h02 cnt
---------------------------
0 1 306826326
0 2 9890655
0 (NU 316716981
1 1
1 1 33664871
1 2 851846
1 (NU 34516718
(N (NU 351233699
(N 1 340491197
(N 2 10742501
(N 1
(11 行)
注意: 为进行显示,某些数据值已被截断。
执行时间: 145.805 秒
(DBA)> select h0,h02,sum(cnt)cnt from(select h0,h02,count(*)cnt from rk.hu group by h0,h02)a group by cube(h0,h02); -- 与上面语句逻辑上等价的通过对子查询再汇总
h0 h02 cnt
--------------------------------------------
0 1 306826326
0 2 9890655
0 (NU 316716981
1 1
1 1 33664871
1 2 851846
1 (NU 34516718
(N (NU 351233699
(N 1 340491197
(N 2 10742501
(N 1
(11 行)
注意: 为进行显示,某些数据值已被截断。
执行时间: 13.375 秒
h0 h02 cnt
---------------------------
1 1
0 1 306826326
1 2 851846
0 2 9890655
1 1 33664871
(5 行)
执行时间: 16.644 秒
(DBA)> select h0,h02,count(*)cnt from rk.hu group by cube(h0,h02);
h0 h02 cnt
---------------------------
0 1 306826326
0 2 9890655
0 (NU 316716981
1 1
1 1 33664871
1 2 851846
1 (NU 34516718
(N (NU 351233699
(N 1 340491197
(N 2 10742501
(N 1
(11 行)
注意: 为进行显示,某些数据值已被截断。
执行时间: 145.805 秒
(DBA)> select h0,h02,sum(cnt)cnt from(select h0,h02,count(*)cnt from rk.hu group by h0,h02)a group by cube(h0,h02); -- 与上面语句逻辑上等价的通过对子查询再汇总
h0 h02 cnt
--------------------------------------------
0 1 306826326
0 2 9890655
0 (NU 316716981
1 1
1 1 33664871
1 2 851846
1 (NU 34516718
(N (NU 351233699
(N 1 340491197
(N 2 10742501
(N 1
(11 行)
注意: 为进行显示,某些数据值已被截断。
执行时间: 13.375 秒
我们可看到,group by cube查询语法给多列组合的分类汇总带来了便利,但直接对原始大量数据进行汇总的效率较差,有某项功能和功能有实用价值是两个不同的概念,而且cube不支持distinct操作,实用性有待提高。Rollup查询与cube类似,不再举例。
5. NULL和空字符串的不同
从上面的例子我们看到Sybase IQ把字符类型列的NULL和空字符串是当作不同的内容处理的。这点和Oracle等数据库不同,需要引起注意。
此外,Sybase IQ还支持With子查询,当子查询被多次引用时可以简化sql语句,例如:
(DBA)> with t as(select 1 a union all select 2)select * from t,t b;
a a
-------------
1 1
1 2
2 1
2 2
(4 行)
a a
-------------
1 1
1 2
2 1
2 2
(4 行)