好的,所以我有一个包含userID和taskID的临时表.它被称为CompletedTasks.我有一个包含userID和taskID的第二个表.它被称为PlannedTasks.
我需要获取已完成但未计划的所有taskID的列表.所以,我需要以某种方式从已完成的任务中清除所有行PlannedTasks.userID != CompletedTasks.userID AND PlannedTasks.taskID != CompletedTasks.taskID
.
我希望这个问题有意义.如果不清楚请告诉我,我会进一步解释.
谢谢你的任何提示!
ype*_*eᵀᴹ 79
您可以使用此(更紧凑的语法):
SELECT *
FROM CompletedTasks
WHERE (userID, taskID) NOT IN
( SELECT userID, taskID
FROM PlannedTasks
) ;
Run Code Online (Sandbox Code Playgroud)
或NOT EXISTS
版本(虽然更复杂,使用适当的索引应该更有效):
SELECT c.*
FROM CompletedTasks AS c
WHERE NOT EXISTS
( SELECT 1
FROM PlannedTasks AS p
WHERE p.userID = c.userID
AND p.taskID = c.taskID
) ;
Run Code Online (Sandbox Code Playgroud)
当然还有LEFT JOIN / IS NULL
@jmacinnes在他的回答中的版本.
这是你需要的吗?
select ct.* from
completedTasks ct
left outer join plannedTasks pt on ct.taskId = pt.TaskId and ct.userId = pt.userId
where pt.taskId is null
Run Code Online (Sandbox Code Playgroud)
但是,我同意评论 - 鉴于我们从问题中知道状态列听起来比两个表更好的模式.