从不在另一个表中的表中选择记录

从不在另一个表中的表中选择记录

问题描述:

我有两个表。从不在另一个表中的表中选择记录

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) 

其返回零个记录。我将如何做到这一点?

+0

你得到一个交叉产品。了解有关加入 – Jens

+0

左连接并检查为空 – Drew

+0

在这种情况下,“等级”是什么?这就像'水平'/'难度'? – Strawberry

简单规则:从不FROM子句中使用逗号。 总是使用明确的JOIN语法。

无论如何,您需要以特定的方式来解决这个问题。从所有学生和所有课程的列表开始。然后用left joinnot 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 
       )