SQL查询根据组中缺少值来过滤记录

时间:2011-03-18 10:59:03

标签: mysql sql

我绞尽脑汁并广泛搜索以寻找解决方案,我怀疑我可能没有清楚地问这个问题所以请耐心等待。

我必须构建一些基于以下基础过滤记录的查询。虽然提取数据涉及多个表格,但我仍然坚持基本要求。

以下是样本值:

Key | Decision   
123 |  Complete  
123 | Additional info  
123 | Something  
123 | Complete
.  
.  
.  
254 | Complete  
254 | Complete  
254 | Complete  
.  
.  
.  

根据以上数据,我可以按键和决策进行选择和分组,以获得如下数据集:

Key | Decision  
123 | Complete  
123 | Additional info  
123 | Something  
.  
.  
.  
254 | Complete   
.  
.  
.

我需要的实际数据有两种类型(这些是必须构建的separe查询)

1)唯一决定是“完成”的键 - 在上面的例子中,只有Key = 254匹配
2)决策可能包含“附加信息”的密钥 - 在上面的例子中,只有Key = 123匹配

似乎几乎可能,就像我的答案浮动在某个地方,我无法理解它。或者这是一厢情愿的想法?

我确实尝试了以下

select key from table where decision not in (select key from table where decision <> "Complete") 

这让我得到了我想要的决定=完成的结果。但是,由于最终选择至少包含至少三个连接,我怀疑性能会变差。查询将在Oracle 11g上执行。

如果有人有建议可以帮助我摆脱这种想法,我会非常感激。

2 个答案:

答案 0 :(得分:1)

对于第一个问题

select `key` from your_table
group by key
having count(decision) = sum(decision="complete")

为第二个

select `key` from your_table
where decision = 'Additional Info'
group by `key`

答案 1 :(得分:0)

1)唯一决定为“完成”的键 - 在上面的示例中,只有Key = 254匹配

select key
  from table
 group 
    by key
having min(decision) = 'Complete'
   and max(decision) = 'Complete'

或@nick rulez使用以下修改编写的内容(以使其在Oracle上运行):

having count(decision) = sum(case when decision = 'Complete' then 1 else 0 end)

2)决策可能包含“附加信息”的键 - 在上面的示例中,只有Key = 123匹配

select distinct key 
  from table
 where decision = 'Additional info';