问题:查找2010年春季之前未参加任何课程的所有学生的ID和姓名。
[takes]
表
ID course_id year (only two data : 2009,2010)
101 CS-400 2009
202 CS-347 2010
303 PHY-191 2009
...
...
[student]
表
ID NAME
101 JUN
202 TYO
303 EOA
......
......
[section]
表
course_id year
CS-400 2009
CS-347 2010
PHY-191 2009
....
...
我想找到那个2009年没有上过课但2010年才上的人。
我的代码
select distinct id,name
from student as S
where not exists(select course_id from section where year=2009
except
select T.course_id from takes as T where S.ID=T.ID);
但是结果是空的。
您可以加入student
到takes
,按学生分组,并在HAVING
子句中设置条件:
select s.id, s.name
from student s
inner join takes t on t.id = s.id
group by s.id, s.name
having min(t.year) = 2010
如果你只对2009年和2010年感兴趣,你也可以添加WHERE
条款:
select s.id, s.name
from student s
inner join takes t on t.id = s.id
where t.year in (2009, 2010)
group by s.id, s.name
having min(t.year) = 2010