2014-02-11 41 views
0

我有一張表,其中包含需要從中排除行的ID列表。對於每一行,一個ID在comment_code列中可以有一個值。我需要從結果中排除具有兩個特定值組合的ID,並保留僅包含這兩個值中的一個的ID。對不起,如果這不明確。Oracle SQL:嘗試基於列值的組合排除行

表例如:

ID  SEQUENCE  FUNCTION  COMMENT_CODE 
--------------------------------------------------------------- 
1  1    tree   apple 
1  2    bush   orange 
2  1    tree   apple 
2  2    tree   banana 
3  1    bush   strawberry 

輸出需要:

ID  SEQUENCE  FUNCTION  COMMENT_CODE 
--------------------------------------------------------------- 
2  1    tree   apple 

基本上,如果一個ID具有與「蘋果」作爲comment_code和以「桔子」作爲註釋代碼的行的行,我不想在結果中看到該ID。如果一個ID有一行'apple'作爲註釋代碼,我希望在我的結果中看到它們,而不管其他任何comment_code,只要它們沒有橙色註釋代碼就可以。

任何幫助將不勝感激。我試過使用存在和不存在子句的組合,以及listagg將每個ID的comment_code值組合在一起,但我沒有得到預期的結果。

回答

2

這種方法使用的聚合,從而找到所有id S作兩個值。這是通過使用用作排除列表一個left outer join

select * 
from table t left outer join 
    (select id 
     from table t 
     group by t.id 
     having sum(case when comment = 'apple' then 1 else 0 end) > 0 and 
      sum(case when comment = 'orange' then 1 else 0 end) > 0 
    ) toexclude 
    on t.id = toexclude.id 
where toexclude.id is null; 
+0

謝謝戈登!我添加了「AND T.COMMENT ='apple'」,現在我得到了預期的結果。我昨天想過做一個CASE,但我無法想像如何在這種情況下實現它。 – user1904581

+0

當你說'group by t'你是否指'按ID編組? –

+0

@CaiusJard。 。 。謝謝。 –

0

像這樣的東西應該工作。

select * 
from yourtable 
where sequence = 1 
and whatever 
+0

丹,我應該補充說,真實表上有幾個不同的評論代碼,對於每個ID沒有特定的順序,所以序列值並不真正相關。 'apple'評論代碼可以在序列1上,也可以在序列99上,這取決於評論代碼添加到ID的順序。 – user1904581

+0

那你怎麼知道你想要哪些評論? –

+0

例如,我想要的評論是'apple'。我用Gordon的例子得到了我需要的東西,並添加了一個額外的標準。 – user1904581

0

選擇*
從表t
其中存在(從雙
選擇1其中t.function = '樹' 和t.comment_code = '蘋果')

+0

回答時,請說明您必須解決的問題。也使用適當的代碼格式。 –