我需要找到所有在CS348中以及ECE264或CS503中注册的学生的学生证和姓名。但是,我的查询仅返回CS348中的学生。
select distinct STUDENT.s_id, STUDENT.s_name
from STUDENT
join ENROLMENT on STUDENT.s_id=ENROLMENT.s_id
where ENROLMENT.c_id = 'CS348'
and STUDENT.s_id = (select distinct STUDENT.s_id
from ENROLMENT
where ENROLMENT.c_id in ('ECE264', 'CS503'));
看一下数据库:
STUDENT
s_id s_name
234 Anglo Anebal F
235 Abram Ace S
236 Adelbert Antti SP
237 William Walker GR
238 Emila Wdyth GR
239 Judith Elba S
240 Benjamin Bratt SP
241 Tawny Kitaen F
ENROLMENT
c_name s_id
CS110 240
CS110 241
CS348 235
CS348 239
CS348 237
CS250 236
CS250 241
ECE264 236
ECE264 237
ECE264 238
MA525 236
CS503 238
CS503 239
CS448 240
CS250 240
MA511 240
我需要找到所有在CS348中以及在ECE264或CS503中注册的学生的学生证和姓名。
除了=
与子查询一起使用,您的方法基本上还不错:
select s.s_id, s.s_name
from STUDENT s join
ENROLMENT
on s.s_id = e.s_id
where e.c_id = 'CS348' and
s.s_id in (select s.s_id
from ENROLMENT e2
where e2.c_id in ('ECE264', 'CS503')
);
请注意使用表别名来简化查询的编写。另外,select distinct
在子查询中绝对不需要。而且我怀疑外部查询中是否也需要它-一个学生可能不能多次注册一个班级。
也就是说,我经常使用聚合来解决此类问题:
select s.s_id, s.s_name
from STUDENT s join
ENROLMENT
on s.s_id = e.s_id
group by s.s_id, s.s_name
having sum(case when e.c_id = 'CS348' then 1 else 0 end) > 0 and
sum(case when e.c_id in ('ECE264', 'CS503') then 1 else 0 end) > 0 ;
每个having
条件都在检查课程中的条件之一。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句