2016-07-15 139 views
1

我有兩個表。從不在另一個表中的表中選擇記錄

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

回答

3

簡單規則:從不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 
       ) 
相關問題