Posted on 2011-12-07 10:36 
哈希 阅读(331) 
评论(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章,想了解更全面的信息,大家可以参考。