我的系统中有3个表:课程,分数和用户。分数是一个表格,其中包含每个课程和每个用户的测试结果。所以我有ScoreID,CourseID,UserID和Score本身。
我想在某些页面中显示用户尚未完成的课程列表。所以我希望它显示所有课程,不包括用户在Scores表中记录的那些课程(意味着他已经完成了它)。
当某个CourseID和UserID同时匹配时,如何从SELECT语句中排除行?
答案 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 Bannister的答案可以简化一点......
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
)