sql - 参加过学位课程每门课程考试的学生
问题描述
我一直在尝试采用“不存在”的方法来隔离答案,但我认为我已经走得太深了。我仅限于基本上只使用非常基本的东西来介绍我的数据库类。所以,基本上只有 INNER JOIN、UNION 和 CASE 以及其他一些东西,但可能最好假设像基本的东西。我们还不允许使用合并。
解决方案
不确定仅使用 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
)
推荐阅读
- angular - 如何将值传递给 ng-container ngTemplateOutlet
- c++ - 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- android - 即使获取了 WakeLock,也停止执行 ForegroundService
- webpack - 我应该在生产服务器上安装 webpack 吗?
- go - 相关字符串常量的惯用表示
- python - 使用 os.system 时 Python 使用 ffmpeg 未运行
- webpack - 为什么 laravel-mix 在我的输出 js 文件中包含 webpack 引导代码?
- swift - 用 UIActivityViewController 替换 UISearchBar 放大图标
- wpf - 如何在派生控件中获得(MahApps)地铁风格?
- android - 无法在我的智能手机上运行 python-android 应用程序