Oracle 横表/纵表用场以及它们之间的相互转换
1、横表和纵表
横表:一般指咱们平时在数据库中创建的表,是一种普通的建表方式。
(主键、字段一、字段2......)如:时间、客户ID,基本通话费、漫游通话费,国内长途费、国际长途费....。
纵表:通常很少见,在表结构不肯定的时候,如需增长字段的状况下的一种建表方式。
2、执行效率
横表:后台数据库管理员操做简单,直观,清晰可见,一目了然。但若要给横表中添加一个或者多个字段,就须重建表结构。
纵表:对于横表的弊端,纵表中只须要添加一条记录,就能够添加一个字段,所消耗的代价远比横表小。可是纵表的对于数据描述不是很清晰,并且会形成数据库数量不少。在查询的时候用到group等函数会大大下降执行效率。纵表的初始映射要慢一些,纵表的变动的映射可能要快一些,若是只是改变了单个字段时,毕竟横表字段比纵表要多不少。
3、转换
1.在平时的开发过程当中,可能会遇到字段的添加或者更好的维护和管理大数据量的表,就 会涉及到纵表和横表之间的转换。
2.把不容易改动表结构的设计成横表,把容易常常改动不肯定的表结构设计成纵表。
举例:
注:DECODE函数是ORACLE PL/SQL的功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示若是value等于if1时,DECODE函数的结果返回then1,...,若是不等于任何一个if值,则返回else。
sign函数:在数学和计算机运算中,其功能是取某个数的符号(正或负): 当x≥0,sign(x)=1; 当x<0, sign(x)=-1;
纵表转横表
- 纵表结构: TEST_Z2H
- FNAME FTYPE FVALUE
- 员工 zaocan 10
- 员工 zhongcan 20
- 员工 wancan 5
-
- 转换后的表结构:
- FNAME ZAOCAN_VALUE ZHONGCAN_VALUE WANCAN_VALUE
- 员工 10 20 5
-
- 纵表转横表SQL示例:
- SELECT FNAME,
- SUM(DECODE(FTYPE,'zaocan',FVALUE,0)) AS ZAOCAN_VALUE,
- SUM(DECODE(FTYPE,'zhongcan',FVALUE,0)) AS ZHONGCAN_VALUE,
- SUM(DECODE(FTYPE,'wancan',FVALUE,0)) AS WANCAN_VALUE
- FROM TEST_Z2H
- GROUP BY FNAME;
横表转纵表
- 横表结构: TEST_H2Z
- ID 姓名 语文 数学 英语
- 1 张三 80 90 70
- 2 李四 90 85 95
- 3 王五 88 75 90
-
- 转换后的表结构:
- ID 姓名 科目 成绩
- 1 张三 语文 80
- 2 张三 数学 90
- 3 张三 英语 70
- 4 李四 语文 90
- 5 李四 数学 80
- 6 李四 英语 99
- 7 王五 语文 85
- 8 王五 数学 96
- 9 王五 英语 88
- 横表转纵表SQL示例:
- SELECT 姓名,'语文' AS 科目,语文 AS 成绩 FROM TEST_H2Z UNION ALL
- SELECT 姓名,'数学' AS 科目,数学 AS 成绩 FROM TEST_H2Z UNION ALL
- SELECT 姓名,'英语' AS 科目,英语 AS 成绩 FROM TEST_H2Z
- ORDER BY 姓名,科目 DESC;
4、这里有一篇用另外一种方式实现转换并且带和值查询的博文:http://exceptioneye.iteye.com/blog/1153345
欢迎关注本站公众号,获取更多信息