我正在尝试编写一个 SQL 查询,该查询将返回一个人有资格参加给定的已完成科目列表(用作先决条件)的课程列表。
我的数据库是这样布局的。
Prerequisite:
+---------------+---------------+
| Id | Name | (Junction table)
|---------------|---------------| CoursePrerequisites:
| 1 | Maths | +---------------+---------------+
| 2 | English | | Course_FK | Prerequisite_FK
| 3 | Art | |---------------|---------------|
| 4 | Physics | | 1 | 1 |
| 5 | Psychology | | 1 | 2 |
+-------------------------------+ | 2 | 3 |
| 2 | 5 |
Course: | 5 | 4 |
+---------------+---------------+ +---------------v---------------+
| Id | Name |
|---------------|---------------|
| 1 | Course1 |
| 2 | Course2 |
| 3 | Course3 |
| 4 | Course4 |
| 5 | Course5 |
+---------------v---------------+
我一直在尝试一个如下所示的查询:
SELECT DISTINCT C.*
FROM Course C
INNER JOIN JNCT_Course_Prerequisites cp
ON C.Id = cp.Course_FK
WHERE cp.Prerequisite_FK IN (SELECT Prerequisites.Id FROM Prerequisites Where Name = 'Art' AND Name = etc etc)
然而,这会返回任何以艺术为先决条件的课程,而不仅仅是那些以艺术为先决条件的课程。完全地满足给定的先决条件列表。例如。如果仅将艺术作为学生的先决条件,它将返回课程 2,即使该课程还需要心理学。
我对 SQL 很陌生,所以如果我的表布局等有问题或者这是一个看似简单的问题,请原谅我。我一直在尽我所能地进行搜索,但只能找到似乎是该问题的反面解决方案。
看来我需要做不同的组:
- 构建一组具有先决条件的课程(对于每个先决条件?)
- 构建一组没有先决条件的课程
- 执行集合差异操作:选择第一组中存在且第二组中不存在的所有内容
看起来很简单,但我现在对联结表以及如何跨许多先决条件处理这个问题感到困惑。
我希望返回至少完全满足给定先决条件列表的行,而不是包含至少一个先决条件的行。
例如,如果给出了先决条件“艺术”、“英语”、“心理学”,则应返回的唯一行是 Course2 的行(已满足先决条件)。
Thanks
SELECT * FROM Course C LEFT JOIN Course_Prerequisites cp ON C.Id = cp.Course_FK
WHERE Prerequisite_FK IN (SELECT Prerequisites.Id FROM Prerequisites Where Name = 'Art' OR Name = etc etc)
NOT EXISTS
(SELECT * FROM Course C LEFT JOIN Course_Prerequisites cp ON C.Id = cp.Course_FK
WHERE Prerequisite_FK NOT IN (SELECT Prerequisites.Id FROM Prerequisites Where Name = 'Art' OR Name = etc etc))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)