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_id
、status
、type
我对所有 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
我有三个表: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
感兴趣,但 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