当2个键匹配时,如何从SELECT语句中排除某些行?

时间:2012-03-13 14:25:22

标签: sql

我的系统中有3个表:课程分数用户。分数是一个表格,其中包含每个课程和每个用户的测试结果。所以我有ScoreID,CourseID,UserID和Score本身。

我想在某些页面中显示用户尚未完成的课程列表。所以我希望它显示所有课程,不包括用户在Scores表中记录的那些课程(意味着他已经完成了它)。

当某个CourseID和UserID同时匹配时,如何从SELECT语句中排除行?

4 个答案:

答案 0 :(得分:1)

尝试:

select *
from Courses c
cross join Users u
where not exists
(select null from Scores s where s.CourseID = c.CourseID and s.UserID = u.UserID)

答案 1 :(得分:1)

假设这只适用于一个用户,Mark Ba​​nnister的答案可以简化一点......

SELECT
  *
FROM
  Courses
WHERE
  NOT EXISTS (SELECT * FROM Scores WHERE CourseID = Courses.CourseID AND UserID = @userID)

答案 2 :(得分:0)

假设您正在使用SQL Server,您可以

  • CROSS APPLY课程和用户,创建课程和用户的所有可能组合
  • 使用NOT EXISTS过滤掉UserID存在的记录。

SQL声明

SELECT *
FROM   Courses c
       CROSS APPLY Users u
WHERE  NOT EXISTS (
         SELECT *
         FROM   Scores
         WHERE  UserID = u.UserID
                AND ScoreID = c.ScoreID
       )

如果您使用任何其他DBMS,在大多数DBMS上工作

SELECT *
FROM   Courses AS c
       , Users AS u
WHERE  NOT EXISTS (
         SELECT *
         FROM   Scores
         WHERE  UserID = u.UserID
                AND ScoreID = c.ScoreID
       )

答案 3 :(得分:0)

select *
from Courses
where not exists
      (
          select null from Scores where Scores.CourseID = Courses.CourseID
                                    and Scores.UserID = Courses.UserID
      )