当前位置: 代码迷 >> Sql Server >> sql语句,或思路解决效率有关问题
  详细解决方案

sql语句,或思路解决效率有关问题

热度:43   发布时间:2016-04-27 13:35:33.0
求一个sql语句,或思路解决效率问题
例如有表 T_STUDENT,T_SCORE, student表主键ID,还有一列NAME,score 表有外键 STUDENTID, ENGLISH,MATH,CHINESE,score 表记录每个学生不同科目,不同时间,的成绩
现在要查询出所有学生 各门成绩最好的记录
结果集如下
NAME MAXENGLISH MAXMATH MAXCHINESE

我用的是子查询的方法,但效率好低啊,数据量一大,慢得要死
请问有什么高效的方法吗

------解决方案--------------------
select m.* , n.*
from T_STUDENT m ,T_SCORE n
where m.STUDENTID = n.STUDENTID and n.score = (select max(score) from T_SCORE where 科目 = n.科目)

select m.* , n.*
from T_STUDENT m ,T_SCORE n
where m.STUDENTID = n.STUDENTID and not exists (select 1 from T_SCORE where 科目 = n.科目 and score > n.score)

不过:
SQL code
建议你提供详细的资料:例如表的结构,表之间的关系,测试数据,相关算法及需要的结果。这样有助于我们理解你的意思,更主要的是能尽快让你获得答案或解决问题的方法。
------解决方案--------------------
SQL code
将你的查询条件字段上建索引(最好能建个包含索引)比如create index idx_name on table_name include (NAME,MAXENGLISH,MAXMATH,MAXCHINESE)
------解决方案--------------------
SQL code
select NAME,MAX(ENGLISH) as MAXENGLISH ,MAX(MATH)as MAXMATH,MAX(CHINESE) as MAXCHINESEFROM T_STUDENT S Inner join T_SCORE SC on T.ID=SC.STUDENTIDGROUP BY NAME
------解决方案--------------------
select NAME,max(ENGLISH) as MAXENGLISH,max(MATH ) as MAXMATH ,
max(HINESE) as MAXCHINESE from T_STUDENT left join T_SCORE
on T_STUDENT.id=T_SCORE.STUDENTID
------解决方案--------------------
索引会加快速度
------解决方案--------------------
select NAME,max(ENGLISH) as MAXENGLISH,max(MATH ) as MAXMATH ,
max(HINESE) as MAXCHINESE from T_STUDENT left join T_SCORE
on T_STUDENT.id=T_SCORE.STUDENTID 
where date ......
group by NAME
------解决方案--------------------
用连接吧,不要用子查询

select A.NAME,B.MAXENGLISH,B.MAXMATH,B.MAXCHINESE
from T_STUDENT A 
inner join
(
select STUDENTID,max(ENGLISH) as MAXENGLISH,max(MATH) as MATH,max(CHINESE) as CHINESE
from T_SCORE 
group by STUDENTID
) B on B.STUDENTID = A.Id
------解决方案--------------------
探讨
引用:

select NAME,max(ENGLISH) as MAXENGLISH,max(MATH ) as MAXMATH ,
max(HINESE) as MAXCHINESE from T_STUDENT left join T_SCORE
on T_STUDENT.id=T_SCORE.STUDENTID


如果要给每个字段加上条件,……

------解决方案--------------------
SQL code
select m.* , n.*from T_STUDENT m ,T_SCORE nwhere m.STUDENTID = n.STUDENTIDand n.score = (select max(score) from T_SCORE where 科目 = n.科目 and STUDENTID =nSTUDENTID )
------解决方案--------------------
至于连接还是子查询好是根据你自己的实际情况来定夺的,要看执行计划,不是凭空想象的。
  相关解决方案