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
歡迎關注本站公眾號,獲取更多信息