回 帖 发 新 帖 刷新版面

主题:[讨论]SQL问题,高手请进

最近在做一个学生成绩管理系统,还是那四张表:
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]

回复列表 (共19个回复)

沙发

hzc2大哥哥,GEORGECHIN大哥哥,kosung小妹妹, 请您三位仙人指点一二?

板凳

[quote]求出只选修了学生胡成晶所选全部课程的学生的学号及姓名[/quote]
这一句没弄懂呀?

3 楼

大哥,这是我问的第二个问题,第一个问题是查询选修了'1','3','5'三门课的学生姓名,我最后做出来的答案是查询只选修了'1','3','5'三门课的学生姓名,这一道题里不是'1','3','5'三门,而是胡成晶同学所选的全部课,因为不知道胡成晶同学究竟选了哪几门,所以问题就变得更为复杂了些.因此,再次乞求大虾们帮忙.

4 楼

求出只选修了学生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 楼

激将法?

自己拆开几步就得了..还两个星期?
 
该知道怎么查  胡成晶 的学号 吧?

上面那个知道  知道如何查 胡成晶 修了什么课程吧?

上面那个知道  知道如何查 胡成晶 修了多少门课程吧?

上面那个知道  知道如何查询出 除了只包含胡成晶修过任何一门课程的课程表记录吧?

上面那个知道  知道如何统计上面那个表中每个学号分别有多少门课程会吧?

上面那个知道  那么该知道只要他修的课程门数与胡成晶相同,那他是不是就是你需要的?

上面那个知道  根据他们学号去拿姓名,应该懂吧?

楼上给的是代码,我认为引导..才是更重要的.....

语句拆分成多点 也许你理解得清楚点... 

毕竟只给你一条复合语句 执行成功了 那你又看懂多少?

6 楼

楼上有理,我也赞成讲原理。授人以渔比授人以鱼更好。但愿没有再次刺激别人的心灵,我是怕怕了。

7 楼


给出两步,可愿意?

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 楼

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 楼

这是什么鸟论坛,别人给出结果后议论这么多?!你们早干什么去了?

10 楼

没有,只是想你再讲讲原理,让我们更容易理解些罢了,没有别的意思。

多有得罪,说声抱歉。

我来回复

您尚未登录,请登录后再回复。点此登录或注册