首页 > 解决方案 > 参加过学位课程每门课程考试的学生

问题描述

我一直在尝试采用“不存在”的方法来隔离答案,但我认为我已经走得太深了。我仅限于基本上只使用非常基本的东西来介绍我的数据库类。所以,基本上只有 INNER JOIN、UNION 和 CASE 以及其他一些东西,但可能最好假设像基本的东西。我们还不允许使用合并。

标签: sqlpostgresql

解决方案


不确定仅使用 INNER JOIN、UNION 和 CASE 是否可行 -> 但我找到了一个使用外连接的解决方案(仍然很简单)。

让我们尝试分两步解决这个问题。

1) 让我们看看哪些学生没有完成所有课程

select s.code
  from  programs p inner join students s on (p.degree = s.degree)
                   left outer join exams e on (e.course = p.course and e.student = s.code)
  where e.course is null

我们与学生一起加入程序,然后离开外部加入考试,只过滤那些没有考试行可以匹配的行(这意味着学生还没有参加考试)

2)我们得到所有没有被这个查询返回的学生(意味着他们已经完成了所有必修课)

select
code, name
from student where code not in (

  select s.code
  from  programs p inner join students s on (p.degree = s.degree)
                   left outer join exams e on (e.course = p.course and e.student = s.code)
  where e.course is null

)

推荐阅读