0

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

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 服务器
  • 数据库:Oracle 9.0.1.1 企业版
4

2 回答 2

2

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

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

现在你也说这是一个短暂的现象。如果是这样,那么似乎某些东西正在暂时产生某些记录的第二个版本。也许您有一个 EOD 流程,该流程会出于某种深不可测的原因生成附加customer记录,然后稍后将其清除 - 或关闭旧记录?

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

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

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

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

“查询几天前开始表现得像这样,否则运行良好。”

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


“发票已单独检查”

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


“这可能是一个错误”

可能。您正在使用主要版本的初始生产版本,而这些版本很容易出现错误。但是,如果 - 正如您所断言的那样 - 没有任何变化,软件,即使是零点版本,似乎也不太可能突然开始表现出错误行为。

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

因此,如果这是一个错误,您需要自己追踪它并自己想出一个解决方法。祝你好运。

于 2013-08-22T05:59:14.313 回答
0

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

于 2013-08-30T07:57:46.890 回答