2012-09-18 244 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 

`