2013-08-22 113 views
0

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

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企业
+0

尝试删除该组,并将select更改为'select *'。检查你没有多次获取任何行。 –

+0

我已通过特定invoice_no(此发票结果翻倍)进行检查,它将返回正确的数据 – user2705899

+0

您可以使用http://sqlfiddle.com –

回答

2

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

您提供了一个“实际数据”的样本,但忽略了它来自哪个表。我们假设它是sales_detail表。如果表格中有记录总计为X但查询返回的汇总值为2 X您必须重复计数。也就是说,查询中的连接会导致您获取每个sales_detail记录的两个实例。

现在你又说这是一个暂时现象。如果是这样,那么似乎可能暂时产生某个记录的第二个版本。也许你有一个EOD程序,由于某种深不可测的原因而产生额外的记录,然后后来清除它 - 或关闭旧记录?

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

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

“通常情况下,它会在第一次运行时发生,并在以后给出正确的 结果。”

您是如何建立这种模式的? “通常”和“永远”是一样的:你需要更高的精度来帮助你解决这个问题。你做了什么调查来发现结果为什么会变化?例如,当你运行这个查询时,你是否确定了其他的其他活动?在运行查询之前是否列出了原始数据?

“查询从前几天开始表现得像这样,否则完美地工作 。”

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


“发票已被单独检查”

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


“这可能是一个错误”

可能。您正在使用主要版本的初始版本,而且这些版本的臭名昭着。然而,即使是零点版本的软件似乎也不大可能突然开始展示错误行为,如果 - 如你所声称的 - 没有任何改变。

但即使你是对的,它是一个错误,这种知识不会帮助你。您正在使用Oracle 9iR1的基础版本,该版本的产品已过时十多年。所以显然你的组织并不热衷于升级,而且可能不支持支持,因此修补不是一种选择(即使Oracle会为你提供这种旧软件的补丁,但他们不会)。

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

+0

提供自包含的测试用例基础或原始数据是正确的。发票已单独检查。数据来自sales_detail – user2705899

+0

@ user2705899:这很可能是不正确的。如果你所说的是真实的,那将是甲骨文的一个漏洞。虽然可能,但似乎不太可能。你在这里加入三张桌子。如果其中一个多行与匹配条件匹配,则会得到您观察到的结果。 –

+0

请参阅以下链接(http://oracle.ittoolbox.com/groups/technical-functional/oracle-db-l/has-anyone-seen-oracle-return-a-different-result-set-when-同一查询是运行多次4083907),它可能是一个错误 – user2705899

0

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

相关问题