复合列
来源:互联网 发布:芜湖网络买花花店 编辑:程序博客网 时间:2024/04/29 21:47
复合列
复合列是一个列的集合, 它在分组的时候计算作为一个单元被处理。如下面的语句, 在圆括号中指定列:
ROLLUP(a,(b,c),d)
在这里, (b,c)组成复合列, 并且作为一个单元被处理。通常, 复合列在ROLLUP、CUBE和GROUPING SETS中是有用的。例如, 在CUBE或ROLLUP中, 复合列将跳过某些级别上的聚合。
即, GROUP BY ROLLUP(a,(b,c))
相当于:
GROUP BY A,B,C UNION ALL
GROUP BY A UNION ALL
GROUP BY ()
在这里, (b,c)被作为一个单元处理, 并且ROLLUP将不被用于(b,c)。它就好象你有一个别名, 例如z, 用于(b,c), 这时GROUP BY表达式变为GROUP BY ROLLUP(a,z)。
同样, GROUP BY CUBE((A,B),C)
相当于
GROUP BY A,B,C UNION ALL
GROUP BY A,B UNION ALL
GROUP BY C UNION ALL
GROUP BY ()
下面的表显示了分组集的声明和等价的GROUP BY声明。
分组集语句 等价的GROUP BY 语句
GROUP BY GROUPIN SETS(A, B, C) GROUP BY A UNION ALL
GROUP BY B UNION ALL
GROUP BY C
GROUP BY GROUPING SETS(A, B, (B,C)) GROUP BY A UNION ALL
GROUP BY B UNION ALL
GROUP BY B,C
GROUP BY GROUPING SETS((A, B, C)) GROUP BY A, B, C
GROUP BY GROUPING SETS(A, (B), ()) GROUP BY A UNION ALL
GROUP BY B UNION ALL
GROUP BY ()
GROUP BY GROUPING SETS(A, ROLLUP(B,C)) GROUP BY A UNION ALL
(GROUPING SETS表达式有一个组合列) GROUP BY ROLLUP(B,C)
幻灯片中的例子计算下面的分组;
- (DEPARTMENT_ID, JOB_ID, MANAGER_ID)
- (DEPARTMENT_ID)
- ()
幻灯片中的例子也可以被写为:
SELECT DEPARTMENT_ID, JOB_ID, MANAGER_ID, SUM(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID, JOB_ID, MANAGER_ID
UNION ALL
SELECT DEPARTMENT_ID, TO_CHAR(NULL), TO_NUMBER(NULL), SUM(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
UNION ALL
SELECT TO_NUMBER(NULL), TO_CHAR(NULL), TO_NUMBER(NULL), SUM(SALARY)
FROM EMPLOYEES
GROUP BY () ;
在缺少查看交叉查询块产生执行计划的优化器时, 前面的查询将需要三次基表EMPLOYEES扫描, 这将是非常低效的。因此建议使用复合列。
再看下面的例子:
SELECT DEPARTMENT_ID, JOB_ID, MANAGER_ID, SUM(SALARY)
FROM EMPLOYEES
GROUP BY ROLLUP(DEPARTMENT_ID, JOB_ID, MANAGER_ID) ;
该查询, 在ORACLE服务器中计算下面的分组:
1、(DEPARTMENT_ID, JOB_ID, MANAGER_ID)
2、(DEPARTMENT_ID, JOB_ID)
3、(DEPARTMENT_ID)
4、()
在上述的例子中, 如果你只对行(1)、(3)、(4)的分组感兴趣, 不使用复合列你就不能限制住计算那些不使用的分组。 如果使用复合列, 在累计时, 将JOB_ID和MANAGER_ID列作为一个单个的单元进行处理就成为可能。当计算ROLLUP和CUBE时, 在圆括号中附加的列被作为一个单元处理。幻灯片中的例子图示了该种处理。在圆括号中放入JOB_ID和MANAGER_ID列, 我们指示ORACLE服务器将JOB_ID和MANAGER_ID作为一个单独的单元处理, 好象一个复合列。
- 复合列
- 什么复合索引前导列?
- 复合索引与其前导列
- 什么复合索引前导列?
- 复合列的not in的问题
- 复合索引的前导列如何选择?
- 复合索引的列顺序判断
- Mysql 多列形成主键(复合主键
- 复合
- 复合
- sql server 2008 设置复合唯一键 多列复合构成唯一 的两种姿势
- SQL复合查询“列名无效”与“ID不明确”解决方法
- Oracle 中的复合索引谁放在第一列上。
- ofbiz之entity 实体解析 扩展 视图 复合列写法
- ofbiz之entity 实体解析 扩展 视图 复合列写法
- ofbiz之entity 实体解析 扩展 视图 复合列写法
- 复合分区 (范围-散列分区,范围-列表分区)
- Pandas如何将Series的复合索引提取为列?
- 九、硅谷的另一面
- LeetCode OJ:Populating Next Right Pointers in Each Node
- Python 语法基础
- 关于两个值的交换
- ping 丢包率解释
- 复合列
- 让 32 位 windows 7 支持超过 4G 内存(PAE)
- peral 读取路径的txt文件。
- fatal: could not read Password for 'https:/username@bitbucket.org': No such file or directory
- Unity3D调用摄像头显示当前拍摄画面
- <MEMORY>Project Euler NO13
- 老虎基金购入2亿美元阿里股份
- 3D手游:现在还吃不到的一块肥肉
- 结构体字节对齐笔记(Mac OS 10.9 中测试)