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

【讨论】:

为什么要使用&lt; 1 而不是= 0 @GordonLinoff,好点 = 0 是老生常谈,不知道为什么我使用 &lt; 1 有问题,我的错

以上是关于ORACLE 中使用 GROUP BY 和 HAVING COUNT(condition) 的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

oracle中,还是不甚明白order by和group by的用法

在oracle里 group by 分组是怎么回事 为啥有时候不加group by说不是单组分组函数?

oracle中group by用法

如何在 Oracle 11g 中使用 group by 和 pivot

oracle group by 查询 排序

oracle group by 性能优化