获取记录的查询具有 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”的应用程序