从不在另一个表中的表中选择记录
问题描述:
我有两个表。从不在另一个表中的表中选择记录
Course
course_id | name
------------------
1 | PROG
2 | ENGL
3 | SCIE
Enrollment List
ID | student_id | course_id | grade
-----------------------------------
1 | 445566 | 1 | 4.0
2 | 445566 | 2 | 2.0
3 | 778899 | 3 | 2.5
我需要查询这些表,以便它返回student_id和他们还没有采取的课程。结果应该是:
student_id | course_id
----------------------
445566 | 3
778899 | 1
778899 | 2
我试着查询
SELECT student_id, name FROM course c, list l WHERE NOT EXISTS(SELECT NULL FROM course c, list l WHERE c.course_id=l.course_id)
其返回零个记录。我将如何做到这一点?
答
简单规则:从不在FROM
子句中使用逗号。 总是使用明确的JOIN
语法。
无论如何,您需要以特定的方式来解决这个问题。从所有学生和所有课程的列表开始。然后用left join
或not exists
来筛选出不在列表中的那些:
SELECT s.student_id, c.name
FROM course c CROSS JOIN
(SELECT DISTINCT student_id FROM list l) s
WHERE NOT EXISTS (SELECT 1
FROM list l2
WHERE c.course_id = l2.course_id and s.student_id = l2.student_id
)
你得到一个交叉产品。了解有关加入 – Jens
左连接并检查为空 – Drew
在这种情况下,“等级”是什么?这就像'水平'/'难度'? – Strawberry