|
本帖最后由 午夜洗衣机 于 2014-5-16 17:10 编辑
交作业:
方法一(字符数236个):- select a.StuId,b.StuName
- from (select StuId
- from [tblScore$]
- where CourseId in(select Courseid from [tblCourse$] where coursename in("马克思","企业管理"))
- group by StuId,CourseId)a,
- [tblStudent$]b
- where a.StuId=b.StuId
- group by a.StuId,b.StuName
- having count(a.StuId)>1
复制代码 这次的代码套了好几层,我的代码写得比较啰嗦:
1.select Courseid from [tblCourse$] where coursename in("马克思","企业管理"):
在表格tblCourse中查找课程名为:马克思和企业管理,这两门课对应的课程ID
2.select StuId from [tblScore$] where CourseId in(select Courseid from [tblCourse$] where coursename in("马克思","企业管理")) group by StuId,CourseId:
在表格tblScore中查找选修课程为马克思和企业管理的学生ID,结果集是所有选了马克思或者企业管理的学生ID,只选一门课的学生有一行记录,选了两门课的会有两行记录. "group by StuId,CourseId"是为了下一步Count(StuId)>1做准备.如果这一步只group by StuId,那么下一步Count(StuId)的结果将全部=1......(因为只按学生分组,那每个人就只有一行记录了)
3.select a.StuId,b.StuName from (2中的代码) a,[tblStudent$]b where a.StuId=b.StuId group by a.StuId,b.StuName having count(a.StuId)>1:
2的代码做为临时表,起别名为a,表tblStudent,起别名为b. 然后用a.StuId=b.StuId将两个表格连接起来,having count(a.StuId)>1结果就是有两行记录,同时选了两门课程的学生
方法二(字符数255个,比方法一多...):- select a.StuId,b.StuName from [tblScore$]a
- left join
- [tblStudent$]b
- on a.StuId=b.StuId
- where CourseId in(select Courseid from [tblCourse$] where coursename ="马克思") and a.StuId in(select StuId from [tblScore$]
- where CourseId in(select Courseid from [tblCourse$] where coursename ="企业管理"))
复制代码 方法三(字符数191个,最少,而且没有子查询):- select a.StuId,c.StuName
- from [tblScore$]a,[tblCourse$]b,[tblStudent$]c
- where a.CourseId=b.CourseId and a.StuId=c.StuId and b.CourseName in("马克思","企业管理")
- group by a.StuId,c.StuName
- having(count(a.StuId)=2)
复制代码 把[tblScore$]a,[tblCourse$]b,[tblStudent$]c 三个表连接起来,取课程名是马克思和企业管理的学生ID和姓名
关键是这一句:having(count(a.StuId)=2),筛选同时选择两门课的学生
|
评分
-
查看全部评分
|