我有一个表记录课程进度的状态。当课程开始时,每个用户/课程共同添加一条新记录。课程完成后,该记录会更新为“已完成”状态。我需要为从未完成任何课程的用户找到记录。单表查询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
任何帮助理解。
我有一个表记录课程进度的状态。当课程开始时,每个用户/课程共同添加一条新记录。课程完成后,该记录会更新为“已完成”状态。我需要为从未完成任何课程的用户找到记录。单表查询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
任何帮助理解。
Select User, Course, Status from MyTable where User not in (Select Distinct User from MyTable where Status = 'C')
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
)
+1对于某些RDBMS,您需要在总和'HAVING中使用'CASE' SUM(如果状态='C'THEN 1 ELSE 0 END)= 0',如果RDBMS没有为布尔比较返回1(像MySQL那样) –
好点。谢谢。 –
您可以选择3列并按1分组吗?我是MS风格的SQL程序员,我不能在我使用的SQL中! – sebt
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
这里有一个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)
+1相同的逻辑,我的答案。当我可以使用连接时,我有一种(可能是莫名其妙的)对IN的反感......优化器很可能以同样的方式处理... – sebt