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; 
    縱錶轉橫表 

   
Java代碼    收藏代碼
  1. 縱表結構: TEST_Z2H  
  2. FNAME       FTYPE             FVALUE  
  3. 員工        zaocan              10  
  4. 員工       zhongcan             20  
  5. 員工        wancan               5  
  6.    
  7. 轉換後的表結構:  
  8. FNAME     ZAOCAN_VALUE          ZHONGCAN_VALUE       WANCAN_VALUE  
  9. 員工           10                     20                    5  
  10.    
  11. 縱錶轉橫表SQL示例:  
  12. SELECT FNAME,  
  13.        SUM(DECODE(FTYPE,'zaocan',FVALUE,0)) AS ZAOCAN_VALUE,  
  14.        SUM(DECODE(FTYPE,'zhongcan',FVALUE,0)) AS ZHONGCAN_VALUE,  
  15.        SUM(DECODE(FTYPE,'wancan',FVALUE,0)) AS WANCAN_VALUE  
  16.   FROM TEST_Z2H  
  17.  GROUP BY FNAME;  

    橫錶轉縱表 
  
Java代碼    收藏代碼
  1. 橫表結構: TEST_H2Z  
  2.       ID      姓名    語文        數學       英語        
  3.       1       張三     80         90         70              
  4.       2       李四     90         85         95            
  5.       3       王五     88         75         90            
  6.    
  7. 轉換後的表結構:    
  8.       ID     姓名     科目     成績    
  9.       1       張三     語文     80    
  10.       2       張三     數學     90    
  11.       3       張三     英語     70    
  12.       4       李四     語文     90    
  13.       5       李四     數學     80      
  14.       6       李四     英語     99    
  15.       7       王五     語文     85    
  16.       8       王五     數學     96    
  17.       9       王五     英語     88    
  18. 橫錶轉縱表SQL示例:  
  19. SELECT   姓名,'語文'   AS     科目,語文   AS   成績   FROM   TEST_H2Z   UNION   ALL   
  20. SELECT   姓名,'數學'   AS     科目,數學   AS   成績   FROM   TEST_H2Z   UNION   ALL   
  21. SELECT   姓名,'英語'   AS     科目,英語   AS   成績   FROM   TEST_H2Z  
  22. ORDER BY 姓名,科目 DESC;   

4、這裏有一篇用另外一種方式實現轉換並且帶和值查詢的博文:http://exceptioneye.iteye.com/blog/1153345

相關文章
相關標籤/搜索