Oracle查询以查找表中列的唯一出现

时间:2017-11-06 17:33:16

标签: sql oracle

这是我的表:

ID|2ndID|Value
1|ABC|103
2|ABC|102
3|DEF|103
4|XYZ|105

我的查询应该返回第二个ID只有一个值= 103的ID的所有实例。它不应该返回1和2,因为除了103,ABC也有102。 3 | DEF另一方面只有一个值= 103.我需要这样的行。因为值<>所以我也不需要4 | XYZ。 103.根据上面的样本集,我的结果应该只是。

3|DEF|103

我可以使用具有COUNT(*)= 1的2ndID组,它将返回所有但我不知道如何仅将其过滤为值= 103。

提前致谢。

2 个答案:

答案 0 :(得分:1)

这应该返回具有单个2ndId值的所有行

select * from 
my_table where 2ndId in (

select 2ndId 
from my_table  
group by 2ndId
having count(*)  =1 
)

如果您需要为值103强制执行过滤器

select * from 
my_table where 2ndId in (

select 2ndId 
from my_table  
group by 2ndId
having count(*)  =1 
)
and value = 103

答案 1 :(得分:1)

这是聚合查询中HAVING子句的标准应用程序。您希望按第二个ID进行分组,并仅选择只有一行且min(值)为103的组。MIN(value)将是唯一行中的唯一值,仅在具有一行的组中一行开头;而且你不关心任何其他团体。

评论:此解决方案假设组合(second_id, value)是唯一的 - 对于不同的ID,它不能多次出现在表格中。我在原始问题的评论中询问了OP,以澄清事实是否确实如此。

with
  mytable ( id, second_id, value ) as (
    select 1, 'ABC', 103 from dual union all
    select 2, 'ABC', 102 from dual union all
    select 3, 'DEF', 103 from dual union all
    select 4, 'XYZ', 105 from dual
  )
-- End of SIMULATED inputs (for testing only, NOT PART OF THE SOLUTION).
-- SQL query begins BELOW THIS LINE. Use your actual table and column names.
select   min(id) as id, second_id, min(value) as value
from     mytable
group by second_id
having   count(*) = 1 and min(value) = 103
;

ID  SECOND_ID  VALUE
--  ---------  -----
 3  DEF          103