【问题标题】:Why does limiting a working query by WHERE ROWNUM <=10 result in an error from the EXPLAIN PLAN "ORA-12899: value too large for column"?为什么将工作查询限制为 WHERE ROWNUM <=10 会导致 EXPLAIN PLAN “ORA-12899: value too large for column”出错?
【发布时间】:2019-07-09 20:34:52
【问题描述】:

我正在 Responsys 中执行此查询并解释计划。

这个查询的解释计划运行良好,返回大约 70 行计数数据:

select * from ( Select LOCATION, count(LOCATION) COUNT_LOCATION From TABLE Group By LOCATION Order By COUNT_LOCATION Desc )

但在末尾添加行限制WHERE ROWNUM &lt;= 10子句:

select * from ( Select LOCATION, count(LOCATION) COUNT_LOCATION From TABLE Group By LOCATION Order By COUNT_LOCATION Desc ) WHERE ROWNUM <= 10

解释计划结果中的这个错误:

错误:java.sql.SQLException:ORA-00604:递归 SQL 级别 1 发生错误 ORA-12899:列“ACME_CUST”的值太大。“PLAN_TABLE”。“OPTIONS”(实际:33,最大值:30 ) : 将计划集 statement_id ='ACME_CUST:1550184818627' 解释为 acme_CUST.PLAN_TABLE for select * from (Select LOCATION, count(LOCATION) COUNT_LOCATION From TABLE Group By LOCATION Order By COUNT_LOCATION Desc ) WHERE ROWNUM

我正在寻找的结果只是 LOCATION 的前 10 行数。

【问题讨论】:

  • 该错误表明不是您的查询导致错误,而是尝试对该查询执行 EXPLAIN PLAN。您是否明确执行 EXPLAIN PLAN?如果没有,您使用的任何客户端工具似乎都在隐含地这样做,并且可能导致错误。
  • 我正在使用电子邮件服务平台 Responsys,它代表我执行 EXPLAIN PLAN。我会将它们作为标签添加到这个问题中。

标签: sql oracle11g responsys


【解决方案1】:

尝试在排序上使用 ROW_NUMBER()。我认为这是因为 GROUP BY/ORDER BY 组合与 ROWNUM 结合使用:

select * from ( Select LOCATION, count(LOCATION), COUNT_LOCATION, ROW_NUMBER() OVER (ORDER BY COUNT_LOCATION GROUP BY LOCATION Desc) RowNumbers From TABLE Group By LOCATION Order By COUNT_LOCATION Desc) WHERE RowNumbers

其他形式见本文:How to use Oracle ORDER BY and ROWNUM correctly?

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2015-04-17
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多