简体   繁体   中英

SQL query - list of items in one table not in another

I need some help with a SQL query. I have a table of courses and a table that contains user id and course id, denoting courses that user has taken (might not have taken any; no entry in that table for that user id).

I need a query to return the list of courses not taken.

Course Category table
    CategoryID
    Caegory

Courses table
    CourseID
    CategoryID
    CourseName
    ...

UserCourse table
    UserID
    CourseID

you can use not exists

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

This will just list the course

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

what i need is for a given user id and course category, what courses within that category have not been taken by this user

(This should have been in the request by the way.)

So:

  1. Select from courses .
  2. Limit to the desired category.
  3. Limit to courses not in the set of courses taken by the user.

The query:

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

Another way of writing same query, which will perform faster.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM