SQL 在 ORACLE 中使用 GROUP BY 和 HAVING COUNT(condition) 进行查询

SQL query with GROUP BY and HAVING COUNT(condition) in ORACLE

我有三个表: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_idstatustype 我对所有 feed_id 感兴趣,但 type='TYPE'

连一个 status='SUCCESS' 都没有

您不能在 Oracle 中 COUNT 布尔表达式,您可以使用 CASE 表达式来代替,例如

HAVING COUNT(CASE WHEN f.status = 'SUCCESS' THEN 1 END) < 1

这个表达式 returns NULL 当条件为假时,所以它只会计算条件为真的行(因为表达式的 COUNT 忽略 NULL 值)。

另请注意(正如@GordonLinoff 在评论中指出的那样)由于 COUNT 不能 return 负数,因此简单地比较结果更清晰(并且效率更高)等于 0,而不是小于 1:

HAVING COUNT(CASE WHEN f.status = 'SUCCESS' THEN 1 END) = 0