oracle 横表与纵表转化

横表和纵表是两种不同的数据库表结构设计方式。横表常见,便于后台管理,但修改表结构需重建。纵表适合不确定的表结构,添加字段代价小,但查询效率低。横表转纵表常用DECODE函数,纵表转横表使用UNION ALL。在实际应用中,应根据需求灵活选择和转换表结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、横表和纵表 

横表:通常指我们平时在数据库中建立的表,是一种普通的建表方式。 

      (主键、字段1、字段2......)如:时间、客户ID,基本通话费、漫游通话费,国内长途费、国际长途费....。 

纵表:一般不多见,在表结构不确定的时候,如需增加字段的情况下的一种建表方式。 

二、执行效率 

    横表:后台数据库管理员操作简单,直观,清晰可见,一目了然。但若要给横表中添加一个或者多个字段,就须重建表结构。 

    纵表:对于横表的弊端,纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小。但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多。在查询的时候用到group等函数会大大降低执行效率。纵表的初始映射要慢一些,纵表的变更的映射可能要快一些,如果只是改变了单个字段时,毕竟横表字段比纵表要多很多。

三、转换 

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;   

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26207198/viewspace-1116691/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值