【问题标题】:Oracle query to find unique occurrences of a column in a tableOracle查询以查找表中列的唯一匹配项
【发布时间】:2017-11-06 17:33:16
【问题描述】:

这是我的桌子:

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

我的查询应返回 ID 的所有实例,其中第二个 ID 只有一个 Value=103。它不应该返回 ID 1 和 2,因为除了 103 之外,ABC 也有 102。另一方面,3|DEF 只有一个 Value = 103。我需要这些行。我也不需要 4|XYZ,因为值 103。基于上面的示例集,我的结果应该只是。

3|DEF|103

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

提前致谢。

【问题讨论】:

  • 你也可以有第五行 ID = 5, 2ndID = 'DEF', and value = 103?在这种情况下,期望的结果是什么?是否也要选择该行?
  • 不,这是不可能的。感谢您的提问。

标签: sql oracle


【解决方案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

【讨论】:

    【解决方案2】:

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

    COMMENT:此解决方案假定组合 (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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-13
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 2017-09-12
      • 1970-01-01
      • 2011-12-02
      相关资源
      最近更新 更多