2013-08-22 170 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上。

相關問題