2014-02-11 39 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

回答时,请说明您必须解决的问题。也使用适当的代码格式。 –