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

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