Posted on 2011-12-07 10:36
哈希 閱讀(317)
評論(0) 編輯 收藏 所屬分類:
sql 總結
- 班級 科目 分數
- 1 語文 8800
- 1 數學 8420
- 1 英語 7812
- ……
- 2 語文 8715
- 2 數學 8511
- 2 英語 8512
- ……
-
-
- 要求轉換成下面這樣的結果
- 班級 語文 數學 英語
- 1 8800 8420 7812
- 2 8715 8511 8512
這是一個非常經典的 4屬性的表設計模式,顧名思義,這樣的表一般有四列,分別是:entity_id, attribute_name, attribute_type, attribute_value ,這樣的設計使我們添加字段非常容易,如:我們想添加一個物理成績是非常簡單的,我們只要向表中插入一條記錄即可。但是,這樣的設計有一個非常嚴重的問題,那就是:查詢難度增加,查詢效率非常差。
要想實現上面的查詢有一個原則,那就是:通過case語句創造虛擬字段,使結果集成為二維數組,然后應用聚合函數返回單一記錄。怎么樣?不理解,仔細看看下面的圖和分析下面的語句你就理解了。

- create table score
- (
- banji integer,
- kemu varchar(10),
- fengshu integer
- )
- go
-
- insert into score values
- (1, '語文', 8800),
- (1, '數學', 8420),
- (1, '英語', 7812),
- (2, '語文', 8715),
- (2, '數學', 8511),
- (2, '英語', 8512)
- go
-
- select banji,
- max(yuwen) 語文,
- max(shuxue) 數學,
- max(yingyu) 英語
- from
- (select banji,
- case kemu
- when '語文' then fengshu
- else 0
- end yuwen,
- case kemu
- when '數學' then fengshu
- else 0
- end shuxue,
- case kemu
- when '英語' then fengshu
- else 0
- end yingyu
- from score
- ) as inner
- group by inner.banji
- order by 1
- go
你可能正在感嘆,這樣的解決方案是多么的巧妙,可惜不是我想出來的,在這里,我也不敢把大師的思想據為己有,以上思想來自<SQL語言藝術>的第11章,想了解更全面的信息,大家可以參考。