整合Where,Group By和Order By子句?

时间:2018-10-25 04:02:16

标签: sql oracle oracle-apex

我似乎无法弄清楚为什么我的查询无法运行。我怀疑问题出在where子句中,但是我不确定为什么。

SELECT COUNT(PRODUCT_ID), PRODUCT_ID
FROM ORDER_ITEMS
WHERE 'COUNT(PRODUCT_ID)' > 6
GROUP BY PRODUCT_ID
ORDER BY COUNT(PRODUCT_ID) DESC;

我从Oracle Apex收到此错误:ORA-01722:无效的数字

谢谢!

1 个答案:

答案 0 :(得分:5)

最初的问题是,您正在将字符串与产生错误消息的数字'COUNT(PRODUCT_ID)' > 6进行比较。但是,您似乎想按聚合结果进行过滤。

还有另一个要使用的子句HAVING子句。它出现在group by子句之后,它可以访问通过分组执行的计算。

SELECT COUNT(PRODUCT_ID), PRODUCT_ID
FROM ORDER_ITEMS
-- where goes here, it cannot access aggregations
GROUP BY PRODUCT_ID
HAVING COUNT(PRODUCT_ID) > 6
ORDER BY COUNT(PRODUCT_ID) DESC;

where子句在执行分组之前发生,因此它无法访问汇总值。

请注意,having子句不能替代where子句,它们具有不同的功能。

了解我们编写SQL查询的方式不是数据库如何评估子句的顺序可能会有所帮助。该序列以fromwhere子句开始,然后是group by,然后是having,然后是select,最后是order by,即:

from
where
group by
having
select
order by

我知道这似乎很奇怪,但是请考虑必须先获取数据才能进行汇总,一旦汇总,我们会忘记不符合Have子句的任何内容,然后排列(选择)列,最后对其余的列进行排序排成所需的行顺序。