要求学生姓名这样做:
select sname from S where sno in
(select b.sno from S a , SC b
where a.SNO=b.SNO and a.sno=b.sno and b.grade >
(select grade
from S c , SC d
where c.sno=d.sno and c.sname='王小华' and d.cno=b.cno )
group by b.sno
HAVING count(b.CNO)>= ( SELECT COUNT(*) FROM SC,S WHERE S.SNO = SC.SNO AND S.SNAME = '王小华' )
)
不用left join 也可:
select b.sno, count(b.CNO) from S a , SC b
where a.sno=b.sno and b.grade >
(select grade
from S c , SC d
where c.sno=d.sno and c.sname='王小华' and d.cno=b.cno )
group by b.sno
HAVING count(b.CNO)>= ( SELECT COUNT(*) FROM SC,S WHERE S.SNO = SC.SNO AND S.SNAME = '王小华' )
结果有了,谢谢2位!
综合了2位,最后答案如下:
select b.sno, count(b.CNO) from S a left join SC b on a.sno=b.sno
where b.grade >
(select grade
from S c left join SC d on c.sno=d.sno
where c.sname='王小华' and d.cno=b.cno )
group by b.sno
HAVING count(b.CNO)>= ( SELECT COUNT(*) FROM SC,S WHERE S.SNO = SC.SNO AND S.SNAME = '王小华' )
select * from c where
(select count(*) from s a left join sc b on a.sno=b.sno
where b.grade >(select grade from s c left join sc d on c.sno=d.sno where s.sname='小华' and d.cno=b.cno and a.s.sno=c.sno))=(SELECT COUNT(*) FROM SC,S WHERE S.SNO = SC.SNO AND S.SNAME = '王小华')
SELECT SNAME FROM
S,
(SELECT SNO,COUNT(*) AS C FROM SC ,
(SELECT SNO,CNO,GRADE FROM SC,S WHERE S.SNO = SC.SNO AND S.SNAME = '王小华') A
WHERE SC.CNO = A.CNO AND SC.GRADE > A.GRADE) B
WHERE S.SNO = B.SNO AND B.C = (SELECT COUNT(*) FROM SC,S WHERE S.SNO = SC.SNO AND S.SNAME = '王小华')