SQL查询 - 一个表中的项目列表不在另一个表中

SQL查询 - 一个表中的项目列表不在另一个表中

问题描述:

我需要一些SQL查询的帮助。我有一个课程表和一个表,其中包含用户ID和课程ID,表示用户已经采取的课程(可能没有采取任何;该表中没有该用户ID的条目)。SQL查询 - 一个表中的项目列表不在另一个表中

我需要一个查询来返回课程列表而不是采取。

Course Category table 
    CategoryID 
    Caegory 

Courses table 
    CourseID 
    CategoryID 
    CourseName 
    ... 

UserCourse table 
    UserID 
    CourseID 
+0

所有课程都没有采取任何用户?所有没有被特定用户使用的课程?所有不是每个用户的课程(即所有的用户/课程对都不在UserCourse表中)? –

这将只列出课程

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

可以使用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

我需要的是一个给定的用户ID和课程类别,哪些课程在该类别内尚未被该用户拍摄

(这本来应该顺便请求。)

所以:

  1. 选择courses
  2. 限于所需的类别。
  3. 限于课程不在用户采取的一套课程。

查询:

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

写同样的查询,将执行更快的另一种方式。

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