ORACLE 中使用 GROUP BY 和 HAVING COUNT(condition) 的 SQL 查询
Posted
技术标签:
【中文标题】ORACLE 中使用 GROUP BY 和 HAVING COUNT(condition) 的 SQL 查询【英文标题】:SQL query with GROUP BY and HAVING COUNT(condition) in ORACLE 【发布时间】:2021-04-25 19:22:03 【问题描述】:我有三个表:temp、product 和 feed。 我将举例说明:
select ri.id from temp ri
inner join product i on ri.id = to_char(i.val)
inner join feed f on f.product_id = i.product_id
where i.status = 'Finished'
and f.type = 'Type'
group by f.feed_id, ri.id
having COUNT(f.status = 'SUCCESS') < 1;
所以我尝试从temp
获取所有具有f.type = 'Type'
的ID。问题是对于一个feed.feed_id
可以是很多行,因为我可以重新触发它 5 次,假设它崩溃了 4 次,但在第 5 次尝试时它是 SUCCESS
,所以对于一个 feed.feed_id
,我将有 5 行,只有一个将与f.status = SUCCESS
。
我收到的这个查询的错误是ORA-00907: missing right parenthesis
,这让我很困惑。
feed table
:
feed_id
, status
, type
我对所有feed_id
感兴趣,它们甚至没有一个status='SUCCESS'
用于type='TYPE'
【问题讨论】:
让帮助您变得简单且可能 - minimal reproducible example。 在ON子句中使用to_char()说明你的表定义不一致。 【参考方案1】:您不能在 Oracle 中使用 COUNT
布尔表达式,您可以使用 CASE
表达式代替,例如
HAVING COUNT(CASE WHEN f.status = 'SUCCESS' THEN 1 END) < 1
此表达式在条件为假时返回NULL
,因此它只会计算条件为真的行(因为表达式的COUNT
会忽略NULL
的值)。
还要注意(正如@GordonLinoff 在 cmets 中指出的那样),由于COUNT
不能返回负数,因此简单地将相等的结果与 0 进行比较会更简洁(并且效率更高),而不是更少大于 1:
HAVING COUNT(CASE WHEN f.status = 'SUCCESS' THEN 1 END) = 0
【讨论】:
为什么要使用< 1
而不是= 0
?
@GordonLinoff,好点 = 0
是老生常谈,不知道为什么我使用 < 1
有问题,我的错以上是关于ORACLE 中使用 GROUP BY 和 HAVING COUNT(condition) 的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
oracle中,还是不甚明白order by和group by的用法
在oracle里 group by 分组是怎么回事 为啥有时候不加group by说不是单组分组函数?