学生选课基本表为 SC(S#,C#,GRADE) 即学号、课程号、成绩
“查询选课程C1和C2的学生学号” 是下面代码
SELECT S#
FROM SC AS X,SC AS Y
WHERE X.S#=Y.S# AND X.C#='C1' AND Y.C#='C2'
【那请问 】: “查询选课程C1但不选C2的学生学号” 这个咋写?
开始我想当然的把 Y.C#='C2' 改成 Y.C#!='C2' ,但发现明显不对
(ps:感觉 不等号 在这种情况下根本没用处嘛,要它何用啊?)
后来想个笨办法:分别求 选C1课程的学生 和 不选C2课程的学生,再把两者求交集。
不过觉得这个不大好,有没有更直接点求出结果的方法呢?
------解决方案--------------------
select s# from sc as a where exists(select 1 from sc where S#=a.S# AND C#='C1')
and not exist(select 1 from sc where S#=a.S# AND C#='C2')
------解决方案--------------------
SELECT s#
FROM sc
WHERE c# = 'C1'
EXCEPT
SELECT s#
FROM sc
WHERE c# = 'C2'