2017-10-06 231 views
1

我需要一些SQL查詢的幫助。我有一個課程表和一個表,其中包含用戶ID和課程ID,表示用戶已經採取的課程(可能沒有采取任何;該表中沒有該用戶ID的條目)。SQL查詢 - 一個表中的項目列表不在另一個表中

我需要一個查詢來返回課程列表而不是採取。

Course Category table 
    CategoryID 
    Caegory 

Courses table 
    CourseID 
    CategoryID 
    CourseName 
    ... 

UserCourse table 
    UserID 
    CourseID 
+0

所有課程都沒有采取任何用戶?所有沒有被特定用戶使用的課程?所有不是每個用戶的課程(即所有的用戶/課程對都不在UserCourse表中)? –

回答

0

這將只列出課程

select * 
from Courses C 
Left join CourseCategory cc on 
cc.CategoryID = c.CategoryID 
where CourseID not in (Select CourseID from UserCourse where UserID = 14) 
+0

只有在用戶已經參加課程時,用戶ID纔會在UserCourse表中。即使我有一個用戶從類別中獲取所有課程,第一個查詢也不會返回任何結果。第二個似乎顯示沒有被任何人採用的課程列表;我需要的是一個給定的用戶ID和課程類別,也沒有采取該類別中哪些課程此用戶。 – NoBullMan

+0

我添加where子句派生表。只需將值更改爲你想要或使用參數 – scsimon

1

可以使用not exists

Select * 
From Courses c 
Where Not Exists (Select 1 From UserCourse uc Where uc.CourseID = c.CourseID) 
+0

什麼我怎麼篩選該給定用戶ID? – NoBullMan

+0

另一個好方法+1 – scsimon

0

我需要的是一個給定的用戶ID和課程類別,哪些課程在該類別內尚未被該用戶拍攝

(這本來應該順便請求。)

所以:

  1. 選擇courses
  2. 限於所需的類別。
  3. 限於課程不在用戶採取的一套課程。

查詢:

select * 
from courses 
where categoryid = 123 
and courseid not in (select courseid from usercourse where userid = 456); 
0

寫同樣的查詢,將執行更快的另一種方式。

select C.CourseID,C.CategoryID 
from Courses C 
Left join CourseCategory cc on 
cc.CategoryID = c.CategoryID 
left join UserCourse uc 
on C.CourseID=uc.CourseID 
where uc.CourseID is null 
相關問題