获取记录的查询具有 some_id 和 some_flag 使得所有相同的 some_id 必须在 oracle 中具有所有 some_flag ='Y'

Posted

技术标签:

【中文标题】获取记录的查询具有 some_id 和 some_flag 使得所有相同的 some_id 必须在 oracle 中具有所有 some_flag =\'Y\'【英文标题】: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 不应该出现在结果中。

实际数据如下:

并希望得到如下结果:

【问题讨论】:

【参考方案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')

【讨论】:

以上是关于获取记录的查询具有 some_id 和 some_flag 使得所有相同的 some_id 必须在 oracle 中具有所有 some_flag ='Y'的主要内容,如果未能解决你的问题,请参考以下文章

在 Markdown 中,链接到页面片段的最佳方式是啥,即#some_id?

AADSTS700016:在目录“some_another_id”中找不到标识符为“some_id”的应用程序

如何获取刚刚单击的按钮用户的 ID? [复制]

如果params和任务名称已在服务器中排队,是否可以跳过委托芹菜任务?

KIVY:我怎样才能得到正确的课程?

Oracle SQL 查询运行缓慢