2012-09-18 198 views
1

我会很感激一些帮助,下面的查询Oracle 10g中选择记录。我有一个表,如下,
满足一定条件

 
UID | Status | Msg_Id | Msg_Id_type 
1 | START | AA  | GLOBAL 
2 | END | AA  | GLOBAL 
3 | PROC | AA  | GLOBAL 
4 | START | BB  | GLOBAL 
5 | START | CC  | GLOBAL 
6 | START | DD  | GLOBAL 
7 | END | DD  | GLOBAL 

我想什么来实现的是只选择那些记录,对于给定的MSG_ID,除了“开始”以外没有任何其他状态,或者除“开始”之外没有任何其他状态的所有记录。非常感谢您的帮助。

+0

请根据您的样本数据所需的输出。 – RedFilter

+0

4 |开始| BB | GLOBAL |
5 |开始| CC | GLOBAL |
由于这些是除“START”以外没有任何其他状态的唯一记录。谢谢。 – MAYBEMEDIC

回答

1

这将为您提供所有仅具有START状态的msg_ids。

select msg_id 
from the_table 
where msg_id in (select msg_id from the_table where status = 'START') 
group by msg_id 
having count(distinct status) = 1 
+0

嗨马,我刚刚跑过上面的查询,但没有得到任何结果 – MAYBEMEDIC

+0

我的歉意。这是导致查询无法返回结果的数据问题。有用。感谢大家的回应.. – MAYBEMEDIC

0

如何:

SELECT * 
FROM my_table a 
WHERE NOT EXISTS (
     SELECT 1 
     FROM my_table b 
     WHERE b.status <> 'START' 
      AND b.msg_id = a.msg_id 
    ) 
    AND a.status = 'START' -- < I think you can ignore this line. 
0

这会帮助你:

SELECT msg_id 
    FROM TABLE 
GROUP by msg_id 
HAVING COUNT(CASE WHEN STATUS = 'START' THEN 1 ELSE NULL END) = 1 
    AND COUNT(CASE WHEN STATUS <> 'START' THEN 1 ELSE NULL END) = 0 

`