多表关联查询,如何提高查询效率

yl_521 2016-09-14 09:12:12
表结构已固定,形式如下。
要求列出学校中人数最多的班级的最高分学生的信息。
三张表各个字段都需要展示。
我已经实现了这个查询,但数据量大时查询效率很低。
请教各位,这个语句该怎么写

school
id schoolname
1 实验中学a
2 实验中学b

classinfo
id classname 学生人数 schoolid
1 初一一班 54 1
2 初一二班 55 1
3 初二一班 53 1
4 初一一班 53 2
5 初一二班 46 2
6 初二一班 63 1

stuinfo
id classname score classid
1 张三 77 2
2 张士 66 1
3 李四 78 1
...全文
2480 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
AAACCCEEEFFFA 2016-09-19
  • 打赏
  • 举报
回复
那建议写2条查询 第一:获取最高分 & 班级
SELECT TOP 1 MAX(分数),COUNT(1)  FROM 学生表  GROUP BY 班级ID ORDER BY COUNT(1) DESC
第二步:在获取相关信息就ok了, 直接关联查询, 不需要做其他的特殊处理
Ltr2011 2016-09-18
  • 打赏
  • 举报
回复
;with a as (),b as () select * from a left jin b on
AAACCCEEEFFFA 2016-09-18
  • 打赏
  • 举报
回复
你写的本身就存在问题, 你要什么样的结果呢。 直接关联查询不就ok?
yl_521 2016-09-18
  • 打赏
  • 举报
回复
引用 7 楼 lylongyuan 的回复:
你写的本身就存在问题, 你要什么样的结果呢。 直接关联查询不就ok?
这个查询是可以得到要想的结果的,只不过数据量大了查询效率低
yl_521 2016-09-17
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
你的语句怎么写的呢?
引用 3 楼 ap0405140 的回复:
请问LZ的语句是什么? 请检查表与表关联的字段上是否有索引.
@唐诗三百首 @卖水果的net 楼上是我用的语句,效率是不很低? 数据量大了真是不行啊。
yl_521 2016-09-17
  • 打赏
  • 举报
回复
表结构重新更正一些错误,如下

表结构
schoolInfo
id	schoolName
1	实验中学a
2	实验中学b

classInfo
id	className	stuNum		schoolid
1	初一一班	54		1
2	初一二班	55		1
3	初二一班	53		1
4	初一一班	53		2
5	初一二班	46		2
6	初二一班	63		1

stuInfo
id	stuName		score	classid
1	张三		77	2
2	张士		66	1
3	李四		78	1
我使用的SQL语句

select a.*,b.className,b.stuNum,c.stuName,c.score 
from schoolInfo as a inner join (
	select id,className,stuNum,schoolid 
	from classinfo where 
	id in 
		(select max(stuNum) from classInfo group by schoolid)
) as b on a.id=b.shoolid
left join(
	select id,stuName,score,classid 
	from stuInfo where id in 
		(select max(score) from stuinfo group by classid)
) as c on c.classid=b.id
AcHerat 2016-09-15
  • 打赏
  • 举报
回复
先对表做统计,再关联!
唐诗三百首 2016-09-15
  • 打赏
  • 举报
回复
try this,

select a.schoolid,c.schoolname,
       a.id,a.classname
 into #schoolclass
 from classinfo a
 inner join (select schoolid,
                    学生人数=max(学生人数)
              from classinfo
              group by schoolid) b on a.schoolid=b.schoolid 
                                      and a.学生人数=b.学生人数
 inner join school c on a.schoolid=c.id

select 'stuid'=e.id,e.classname,e.score,e.classid
 into #stu
 from stuinfo e
 inner join (
select c.classid,
       score=max(score)
 from stuinfo c
 inner join #schoolclass d on c.classid=d.id
 group by c.classid) f on e.classid=f.classid
                          and e.score=f.score


select a.*, b.*
 from #schoolclass a
 inner join #stu b on a.id=b.classid
唐诗三百首 2016-09-15
  • 打赏
  • 举报
回复
请问LZ的语句是什么? 请检查表与表关联的字段上是否有索引.
卖水果的net 2016-09-14
  • 打赏
  • 举报
回复
你的语句怎么写的呢?

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧