2012-11-29 73 views
3

我有一个表记录课程进度的状态。当课程开始时,每个用户/课程共同添加一条新记录。课程完成后,该记录会更新为“已完成”状态。我需要为从未完成任何课程的用户找到记录。单表查询SQL查询帮助

示例表:

User Course Status 
A  1  S 
A  2  C 
B  1  S 
C  2  S 
D  2  C 
C  3  S 

我需要找到以下的查询:

User Course Status 
B  1  S 
C  2  S 
C  3  S 

任何帮助理解。

回答

1
Select User, Course, Status from MyTable where User not in (Select Distinct User from MyTable where Status = 'C') 
+0

+1相同的逻辑,我的答案。当我可以使用连接时,我有一种(可能是莫名其妙的)对IN的反感......优化器很可能以同样的方式处理... – sebt

2
select user, course, status 
from your_table 
where user in 
(
    select user 
    from your_table 
    group by user 
    having sum(CASE WHEN status = 'C' THEN 1 ELSE 0 END) = 0 
) 
+2

+1对于某些RDBMS,您需要在总和'HAVING中使用'CASE' SUM(如果状态='C'THEN 1 ELSE 0 END)= 0',如果RDBMS没有为布尔比较返回1(像MySQL那样) –

+0

好点。谢谢。 –

+0

您可以选择3列并按1分组吗?我是MS风格的SQL程序员,我不能在我使用的SQL中! – sebt

1
SELECT User,Course,Status FROM YourTable a 
LEFT JOIN 
(SELECT DISTINCT User FROM YourTable WHERE Status='C') CompletedAnything 
ON a.User=CompletedAnything.User 
WHERE COmpletedAnything.User IS NULL 
0

这里有一个SQL小提琴,给你想要的东西: http://sqlfiddle.com/#!2/b6988/1

查询是这样的:

select User, Course, Status 
from mytable 
where User not in 
    (select distinct User from mytable where status = 'C' ans User is not null)