列出所有未参加过一个或多个科目的期中考试的学生

时间:2015-06-25 09:19:46

标签: sql-server sql-server-2008

我有3个表,例如StudentSubjectMidterm表。

Student表包含

studid Firstname lastname Class

1      A       R        12A
2      B       S        12A
3      C       T        12A
4      D       U        12A
5      E       V        12B

SUBJECT表包含

subid subname
  1     maths
  2     science
  3     english

MIDTERM表包含

studid subid marks examdate
1        1    100  2014-09-24
1        2     92  2014-09-25
1        2     92  2014-09-26
2        1     74  2014-09-24
2        2     78  2014-09-26
2        3     73  2014-09-26
3        1     90  2014-09-24
3        2     84  2014-09-25
3        2     92  2014-09-25
5        1     87  2014-09-24
4        2     79  2014-09-24
4        3     90  2014-09-26

结果必须是:

Firstname LastName Subname 

2 个答案:

答案 0 :(得分:0)

根据以下评论并假设所有学生必须参加所有中期

select Firstname , lastname , subname
from (
select studid , FirstName, lastname , subID , subname
from student , Subject) d
left outer join midterm m on d.studid = m.studID and d.subid = m.subid
where m.examdate is null

可能在没有catesian连接的情况下编写它,但它应该足够了

答案 1 :(得分:0)

正如我猜测的那样,那个没有通过期中考试的人是#34;那个少于50分的人#34;。 如果没有,你可以在最后一行修复它。

您可以使用INNER JOIN SQL关键字对几个逻辑上互连的表进行查询,以确定匹配条件。

简单地说,首先你需要了解如何在逻辑上提取数据 例如,在您的情况下,您需要从MIDTERM表中进行选择,因为它会存储学生ID和主题ID。

用语言来说,听起来像是:
 1.获取失败的中期的所有结果(中间标记<50)。每行包含studid(未通过考试)和subid(考试失败);  2.从表Student中取出失败的学生的FirstName和LastName;
 3.从表Subject中取出已失败的主题的子名称;
 4.返回这三个值。

在代码中,它看起来像:

SELECT s.Firstname, s.Lastname, subj.subname FROM `MIDTERM`
FROM `MIDTERM` as m
INNER JOIN `Student` as s ON s.stuid = m.studid
INNER JOIN `SUBJECT` as subj ON subj.subid = m.subid
WHERE `marks` < 50