【问题标题】:I keep getting error ORA-01422, ORA-06512我不断收到错误 ORA-01422、ORA-06512
【发布时间】:2016-12-04 19:59:47
【问题描述】:

我不断收到错误 ORA-01422:精确提取返回的行数超过了请求的行数。 ORA-06512:在“CM420A07.ZIP_CODE_SALES_WINNER”,第 6 行。我无法弄清楚到底出了什么问题。

CREATE OR REPLACE FUNCTION ZIP_CODE_SALES_WINNER
  RETURN VARCHAR
IS
  zipWinner VARCHAR2(5);
BEGIN
  SELECT C.zip_code INTO zipWinner
  FROM SALE S JOIN CUSTOMER C
  ON S.cust_ID = C.cust_ID
  GROUP BY C.zip_code
  HAVING COUNT(*) = (
  SELECT MAX(COUNT(*))
  FROM SALE S JOIN CUSTOMER C
  ON S.cust_ID = C.cust_ID
  GROUP BY C.zip_code);  
  RETURN zipWinner;
END;
/
SELECT ZIP_CODE_SALES_WINNER FROM DUAL;

【问题讨论】:

  • 您的错误代码听起来像是在使用 oracle,但您已将问题标记为 mysql
  • 你链接的网站说要创建一个光标来处理这个问题。
  • 我试图创建一个游标,但它似乎不起作用
  • 所以如果很多zip code 有相同的count,你需要不止一行?

标签: oracle function


【解决方案1】:

您的查询返回多个值。

如果您不关心如果有多个邮政编码将选择哪个邮政编码,只需在查询中添加 rownum=1 即可获得正好一行:

SELECT zip_code INTO zipWinner FROM (
SELECT C.zip_code 
  FROM SALE S JOIN CUSTOMER C
  ON S.cust_ID = C.cust_ID
  GROUP BY C.zip_code
  HAVING COUNT(*) = (
  SELECT MAX(COUNT(*))
  FROM SALE S JOIN CUSTOMER C
  ON S.cust_ID = C.cust_ID
  GROUP BY C.zip_code))
  WHERE  rownum =1;  

【讨论】:

  • 我知道我对如何让它只返回一个值感到困惑
  • 如果您有两个(或更多)邮政编码具有相同的计数(*),您会怎么做?如果您不在乎,只需将 rownum =1 添加到查询中即可。
  • @RandyGilman rownum = 1 是一种不好的做法。如果您认为应该使用它,请不要使用它,因为这意味着您的查询缺少某些内容和/或存在根本缺陷。重新思考和重写。
猜你喜欢
  • 2023-03-06
  • 2020-03-10
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2015-08-06
  • 2015-06-11
相关资源
最近更新 更多