【问题标题】:query to get the records have some_id and some_flag such that all same some_id must have all some_flag ='Y' in oracle获取记录的查询具有 some_id 和 some_flag 使得所有相同的 some_id 必须在 oracle 中具有所有 some_flag ='Y'
【发布时间】:2021-02-09 18:08:07
【问题描述】:

我是 sql 初学者,尝试编写查询但没有得到想要的结果

select r1.some_id, count(r1.some_id) as ca   from (select r.some_id,
               r.some_flag,
               count(r.some_id),
               count(r.some_flag)
          from table1 r
         group by r.some_id, r.some_flag) r1  group by r1.some_id

我的要求是:对于表中存在的所有 some_id,其 some_flag 为“Y”,如果一个是 Y,另一个是 N,那么 some_id 不应该出现在结果中。

实际数据如下:

并希望得到如下结果:

【问题讨论】:

    标签: sql oracle subquery jpql


    【解决方案1】:

    您可以通过使用MIN 结合分析函数来避免查询表两次。

    SELECT id, some_id, some_flag
      FROM (SELECT t.*, MIN (some_flag) OVER (PARTITION BY some_id) AS should_return
              FROM table1 t)
     WHERE should_return = 'Y'
    

    【讨论】:

      【解决方案2】:

      这里有一个选项:每个some_id MIN 标志必须等于 MAX 标志,并且它必须是Y

      select * 
      from table1 a
      where a.some_id in (select b.some_id
                          from table1 b
                          group by b.some_id
                          having min(b.some_flag) = max(b.some_flag)
                             and min(b.some_flag) = 'Y'
                         )
      

      【讨论】:

        【解决方案3】:

        这是为您提供结果的选项..

        select *
          from table1 r
        where r.some_flag='Y'
          and not exists (select 1
                            from table1 r2
                           where r.some_id=r2.some_id
                             and r2.some_flag <> 'Y')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          • 2016-11-10
          • 2017-10-23
          • 1970-01-01
          相关资源
          最近更新 更多