【问题标题】:Integrating Where, Group By and Order By clauses?集成 Where、Group By 和 Order By 子句?
【发布时间】:2018-10-25 04:02:15
【问题描述】:

我似乎无法弄清楚为什么我的查询无法运行。我怀疑问题出在 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: invalid number

谢谢!

【问题讨论】:

  • 尝试使用having 而不是使用where 子句并确认PRODUCT_ID 列是数字类型。
  • 我尝试使用 have 仍然得到相同的结果, PRODUCT_ID 绝对是数字类型
  • @NandhakumarMV - 为什么PRODUCT_ID 的数据类型很重要?在PRODUCT_ID 上没有进行算术运算或不等式测试等,它们只被计算在内。您可以计算任何数据类型的值。

标签: sql oracle oracle-apex


【解决方案1】:

最初的问题是您将字符串与产生错误消息的数字'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子句的内容,然后排列(选择)列,最后对剩余的列进行排序行到想要的行顺序。

【讨论】:

  • 请重试,此行中没有单引号HAVING COUNT(PRODUCT_ID) > 6
  • 我觉得这个答案可以使用编辑,首先回答提出的问题(即单引号错误),然后可能添加有关 having 的相关信息,但是回答不同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 2011-06-28
  • 2017-02-06
  • 1970-01-01
相关资源
最近更新 更多