我有一个返回不同结果的组查询,第一次返回错误的结果然后返回正确的结果。
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
几天前查询开始表现得像这样,否则效果很好。
其他信息
环境信息
答案 0 :(得分:2)
这不是我们可以回答的问题。您有一个简单的GROUP BY查询,它将以一致的方式对这些属性求和。如果得到不同的结果,那是因为运行查询时基础数据不同。
您提供了“实际数据”的示例,但忽略了它来自哪个表。我们假设它是sales_detail
表。如果表中的记录总和为 X ,但查询返回的聚合值为2 X ,则必须进行重复计算。也就是说,查询中的联接会导致您获得每个sales_detail
记录的两个实例。
现在你也说这是一种短暂的现象。如果是这样,那么似乎有些东西会暂时产生某些记录的第二个版本。也许你有一个EOD过程,它会因某些不可思议的原因产生额外的customer
记录,然后将其清除 - 或关闭旧记录?
这是我们可以为您提供帮助的限制。这不是Oracle问题,这是您数据库中的一些特性。你可以看到数据,我们不能。您知道 - 或者应该知道 - 业务流程,但我们不知道。
所以我们所能做的就是给你一些指示。
“通常它会在第一次运行时发生,之后会给出正确的结果 结果。“
你是如何建立这种模式的? “通常”与“始终”相同:您将需要更高的精度来帮助您解决此问题。你做了什么调查来发现结果变化的原因?例如,您在运行此查询时是否已确定正在发生的其他活动?您是否在运行查询之前列出了原始数据?
“查询几天前开始表现得像这样,否则就行了 完美“。
那几天前发生了什么变化?
“已单独检查发票”
是的,但您有多个表连接。虚假记录或写得不好的条件可能导致同一记录不止一次加入。
“这可能是个错误”
可能。您正在使用主要版本的初始生产版本,而众所周知,这些版本容易出错。然而,如果 - 你断言 - 没有任何改变,软件,即使是零点版本,似乎也不应该突然开始展示错误的行为。
但是,即使你是对的,这是一个错误,这些知识对你没有帮助。您正在使用Oracle 9iR1的基础版本,该产品的一个版本已经淘汰了十多年。很明显,您的组织并不热衷于升级,并且可能不支付支持,因此修补不是一种选择(即使Oracle会为您提供这些旧软件的补丁,但他们不会这样做。)
所以,如果它是一个bug,你需要自己跟踪它并自己想出一个解决方法。祝你好运。
答案 1 :(得分:0)
在我看来,客户表或销售表都有重复,或者连接不在PK上。