Oracle:嵌套查询中出现意外的被零除错误

问题描述 投票:0回答:1

在添加 WHERE 子句以过滤派生列中的非空值时,我在 Oracle 中遇到被零除错误,即使内部查询已经过滤掉分母为零的情况。在没有附加 WHERE 子句的类似查询中不会出现此问题。

这是有效的查询:

SELECT * FROM (
  SELECT 1/ s_qty AS ratio FROM (
    SELECT SUM(qty) AS s_qty FROM custom_table GROUP BY user
  ) WHERE s_qty <> 0
)

添加 WHERE 子句来检查比率 IS NOT NULL 会引入错误:

SELECT * FROM (
  SELECT 1/ s_qty AS ratio FROM (
    SELECT SUM(qty) AS s_qty FROM custom_table GROUP BY user
  ) WHERE s_qty <> 0
) WHERE ratio IS NOT NULL

将WHERE子句改为HAVING子句就可以解决问题,这很奇怪。

SELECT * FROM (
  SELECT 1/ s_qty AS ratio FROM (
    SELECT SUM(qty) AS s_qty FROM custom_table 
    GROUP BY user
    HAVING SUM(qty) <> 0
  ) 
) WHERE ratio IS NOT NULL

这似乎与优化器的工作方式有关。 其他数据库也有这个问题吗? 是否有配置更改或提示可以解决此问题,例如调整优化器设置?

sql oracle relational-database divide-by-zero database-optimization
1个回答
0
投票

我认为第一个查询并没有真正起作用。你在哪里运行它?大多数客户端(例如 TOAD)不会显示整个结果,即它们仅获取前 500 行,但当您在结果网格中向下滚动时,您会看到相同的错误。

您的查询可以写得更简单,如

SELECT 1/NULLIF(SUM(qty), 0) as ratio
FROM custom_table
GROUP BY user
© www.soinside.com 2019 - 2024. All rights reserved.