主题:[讨论]SQL问题,高手请进
afoxer
[专家分:360] 发布于 2010-01-22 22:31:00
最近在做一个学生成绩管理系统,还是那四张表:
class(clno C(8),clname C(14),number N(2),monitor C(10))
这是班级表,分别有班号,班名,班级人数,班长学号字段;
student(sno C(10),sname C(12),ssex C(2),sage N(2),clno C(8))
这是学生表,分别有学号,姓名,性别,年龄,班号等字段;
course(cno C(2),cname C(24),precno C(2))
这是课程表,分别有课号,课名,先修课课号等字段;
sc(sno C(10),cno C(2),score N(5,1))
这是学生选课及成绩表,分别有学号,课号,成绩等字段。
要求写SQL查询语句,求出只选修了学生胡成晶所选全部课程的学生的学号及姓名,这个问题特复杂,我想了两周都没想出答案,我估计本论坛没几个人能做出来,所以来这里只是碰碰运气,或许那位大虾能帮忙呢?
另外,我注意到本论坛有几位高手, 架吵得出神入化, 我估计VFP的学术造旨也不会低,请高手们在吵闹之余,换换脑筋,帮在下解答一二,拜托了![em1]
最后更新于:2010-01-22 22:37:00
回复列表 (共19个回复)
沙发
afoxer [专家分:360] 发布于 2010-01-22 23:49:00
hzc2大哥哥,GEORGECHIN大哥哥,kosung小妹妹, 请您三位仙人指点一二?
板凳
sywzs [专家分:5650] 发布于 2010-01-23 05:51:00
[quote]求出只选修了学生胡成晶所选全部课程的学生的学号及姓名[/quote]
这一句没弄懂呀?
3 楼
afoxer [专家分:360] 发布于 2010-01-23 08:02:00
大哥,这是我问的第二个问题,第一个问题是查询选修了'1','3','5'三门课的学生姓名,我最后做出来的答案是查询只选修了'1','3','5'三门课的学生姓名,这一道题里不是'1','3','5'三门,而是胡成晶同学所选的全部课,因为不知道胡成晶同学究竟选了哪几门,所以问题就变得更为复杂了些.因此,再次乞求大虾们帮忙.
4 楼
狐说八道 [专家分:860] 发布于 2010-01-23 13:54:00
求出只选修了学生B1所选全部课程的学生的学号及姓名:
select b.sno, (select sn FROM s WHERE b.sno=s.sno) sn ;
from (select COUNT(*) cs2 FROM sc a, s b WHERE a.sno=b.sno AND b.sn='B1') a, ;
(select sno, COUNT(*) cs ;
FROM (select b.sno, b.cno ;
from sc a, sc b ;
where a.cno=b.cno and a.sno='s2' and a.sno!=b.sno) a ;
GROUP BY sno) b, ;
(select sno, COUNT(*) cs1 from sc GROUP BY sno) c ;
where b.cs = a.cs2 AND (b.sno=c.sno AND b.cs = c.cs1)
5 楼
So_Show [专家分:470] 发布于 2010-01-23 15:18:00
激将法?
自己拆开几步就得了..还两个星期?
该知道怎么查 胡成晶 的学号 吧?
上面那个知道 知道如何查 胡成晶 修了什么课程吧?
上面那个知道 知道如何查 胡成晶 修了多少门课程吧?
上面那个知道 知道如何查询出 除了只包含胡成晶修过任何一门课程的课程表记录吧?
上面那个知道 知道如何统计上面那个表中每个学号分别有多少门课程会吧?
上面那个知道 那么该知道只要他修的课程门数与胡成晶相同,那他是不是就是你需要的?
上面那个知道 根据他们学号去拿姓名,应该懂吧?
楼上给的是代码,我认为引导..才是更重要的.....
语句拆分成多点 也许你理解得清楚点...
毕竟只给你一条复合语句 执行成功了 那你又看懂多少?
6 楼
kosung [专家分:910] 发布于 2010-01-23 15:22:00
楼上有理,我也赞成讲原理。授人以渔比授人以鱼更好。但愿没有再次刺激别人的心灵,我是怕怕了。
7 楼
LuckyLine [专家分:1940] 发布于 2010-01-23 16:00:00
给出两步,可愿意?
select cno,sno from sc where sno in(select sno from student where sname='胡成晶') into cursor tabtemp
select cno,score,sc.sno,sname from sc,student where cno in(select cno from tabtemp) and sc.sno=student.sno
8 楼
Vii [专家分:1130] 发布于 2010-01-23 16:06:00
SELECT B.SNO,B.SNAME FROM (
SELECT A.SNO,COUNT(*) AS TJ FROM SC A WHERE EXISTS (SELECT 1 FROM SC B WHERE A.CNO=B.CNO AND B.SNO=4 AND A.SNO<>4) GROUP BY SNO
HAVING COUNT(*)=(SELECT COUNT(SNO) AS HJ FROM SC WHERE SNO=4 GROUP BY SNO)
) A LEFT JOIN STUDENT B ON A.SNO=B.SNO
假设4是胡成晶学号.
思路是:先筛选包含胡成晶所选课程的学生,再结果用HAVING来判断课程门数是否和胡成晶的门数一致,只显示一致的,最后连接学生信息表.
[em14]好像多选了门数比胡成晶多的同学.
9 楼
狐说八道 [专家分:860] 发布于 2010-01-23 16:10:00
这是什么鸟论坛,别人给出结果后议论这么多?!你们早干什么去了?
10 楼
kosung [专家分:910] 发布于 2010-01-23 16:12:00
没有,只是想你再讲讲原理,让我们更容易理解些罢了,没有别的意思。
多有得罪,说声抱歉。
我来回复