Oracle 9.0.1.1 - 返回不同结果的相同查询

时间:2013-08-22 04:56:19

标签: sql oracle group-by aggregate-functions

我有一个返回不同结果的组查询,第一次返回错误的结果然后返回正确的结果。

select 
 c.customer_name, c.customer_address, invoice_no, 
 sum(nvl(invoiced_amount,0)) invoice_amount, 
 sum(nvl(received_amount,0)) received_amount, 
 sum(nvl(returned_amount,0)) returned_amount 
from sales_detail d, sales s, customer c
where d.inquiry_id = s.inquiry_id
and s.customer_id = c.customer_id
and s.sale_date between '01-jan-2012' and '31-dec-2012'
group by c.customer_name, c.customer_address, invoice_no

它会返回多行并提供正确的行数,但会使某些发票的值加倍,通常会在第一次运行时发生,之后会给出正确的结果。
以下是一个例子:

数据库中的实际数据

invoice_no | invoiced_amount | received_amount | returned_amount
000010020  |   500           |      230        |      0

查询结果返回

invoice_no | invoiced_amount | received_amount | returned_amount
000010020  |   1000          |      460        |      0  

几天前查询开始表现得像这样,否则效果很好。

其他信息

  • sales_detail表上有5个索引
  • 客户是一个视图,物理表位于另一个具有相同名称的模式中

环境信息

  • 操作系统:Windows 2003 Server
  • 数据库:Oracle 9.0.1.1 Enterprise

2 个答案:

答案 0 :(得分:2)

这不是我们可以回答的问题。您有一个简单的GROUP BY查询,它将以一致的方式对这些属性求和。如果得到不同的结果,那是因为运行查询时基础数据不同。

您提供了“实际数据”的示例,但忽略了它来自哪个表。我们假设它是sales_detail表。如果表中的记录总和为 X ,但查询返回的聚合值为2 X ,则必须进行重复计算。也就是说,查询中的联接会导致您获得每个sales_detail记录的两个实例。

现在你也说这是一种短暂的现象。如果是这样,那么似乎有些东西会暂时产生某些记录的第二个版本。也许你有一个EOD过程,它会因某些不可思议的原因产生额外的customer记录,然后将其清除 - 或关闭旧记录?

这是我们可以为您提供帮助的限制。这不是Oracle问题,这是您数据库中的一些特性。你可以看到数据,我们不能。您知道 - 或者应该知道 - 业务流程,但我们不知道。

所以我们所能做的就是给你一些指示。

  

“通常它会在第一次运行时发生,之后会给出正确的结果   结果。“

你是如何建立这种模式的? “通常”与“始终”相同:您将需要更高的精度来帮助您解决此问题。你做了什么调查来发现结果变化的原因?例如,您在运行此查询时是否已确定正在发生的其他活动?您是否在运行查询之前列出了原始数据?

  

“查询几天前开始表现得像这样,否则就行了   完美“。

那几天前发生了什么变化?


  

“已单独检查发票”

是的,但您有多个表连接。虚假记录或写得不好的条件可能导致同一记录不止一次加入。


  

“这可能是个错误”

可能。您正在使用主要版本的初始生产版本,而众所周知,这些版本容易出错。然而,如果 - 你断言 - 没有任何改变,软件,即使是零点版本,似乎也不应该突然开始展示错误的行为。

但是,即使你是对的,这是一个错误,这些知识对你没有帮助。您正在使用Oracle 9iR1的基础版本,该产品的一个版本已经淘汰了十多年。很明显,您的组织并不热衷于升级,并且可能不支付支持,因此修补不是一种选择(即使Oracle会为您提供这些旧软件的补丁,但他们不会这样做。)

所以,如果它是一个bug,你需要自己跟踪它并自己想出一个解决方法。祝你好运。

答案 1 :(得分:0)

在我看来,客户表或销售表都有重复,或者连接不在PK上。