查找同时注册两门课程的学生

时间:2019-07-13 08:03:56

标签: sql oracle

我想显示注册了课程100、101的学生ID。如果他们都注册了这两个课程,则只显示一次学生ID。

SELECT studid FROM registration
WHERE courseid='100' or courseid='101';

我不知道如何检查条件-“如果他们都注册了这两个课程,则只显示一次学生ID。”

2 个答案:

答案 0 :(得分:2)

您可以使用DISTINCT

SELECT DISTINCT studid FROM registration WHERE courseid IN ('100', 101');

GROUP BY

SELECT studid FROM registration WHERE courseid IN ('100', '101') GROUP BY studid;

答案 1 :(得分:0)

要查看学生已注册两门课程而不是其中一门课程的条件,您还需要检查已注册课程的数量:

select studid
from   registration
where  courseid in (100, 101)
group by studid having count(distinct courseid) = 2;

(我已经计算了distinct个课程ID,以防万一学生可以为同一门课程注册两次。如果在您的数据模型中这不可能的话,count(*)就可以了。)

或者,您可以使用intersect查找在两组中都出现的学生:

select studid
from   registration
where  courseid = 100
intersect
select studid
from   registration
where  courseid = 101;

或者只是为了好玩,将每个学生的所有小学生收集到一个集合中,然后检查(100,101)是否是其中的子集:

select studid
from   registration
group by studid
having ku$_objnumset(100,101) submultiset of cast(collect(courseid) as ku$_objnumset);

我使用了通过查询ku$_objnumset找到的内置all_coll_types(它属于SYS,并在dbms_metadata中使用),但是您可以创建你自己的,例如

create or replace type number_tt as table of number;