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

複数の行を返し、正しい行数を提供しますが、一部の請求書の値を 2 倍にします。通常、最初に実行したときに発生し、後で正しい結果が得られます。
次に例を示します。

データベースの実際のデータ

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 つのインデックスがあります
  • 顧客はビューであり、物理テーブルは同じ名前の別のスキーマにあります

環境情報

  • OS: Windows 2003 サーバー
  • データベース: Oracle 9.0.1.1 エンタープライズ
4

2 に答える 2

2

これは私たちが答えられる質問ではありません。単純な GROUP BY クエリがあり、これらの属性を一貫した方法で合計します。異なる結果が得られる場合は、クエリを実行したときに基になるデータが異なるためです。

「実際のデータ」のサンプルを提供しますが、それがどのテーブルからのものかは言いません。sales_detailそれがテーブルだとしましょう。合計がXになるレコードがテーブルにあるのに、クエリが 2 Xの集計値を返す場合は、二重にカウントする必要があります。つまり、クエリの結合により、各sales_detailレコードの 2 つのインスタンスが取得されます。

これは一過性の現象だともおっしゃっていますね。もしそうなら、何らかのレコードの 2 番目のバージョンが一時的に生成されている可能性があります。おそらくcustomer、なんらかの不可解な理由で追加のレコードを生成し、後でそれを消去する、または古いレコードを閉じる EOD プロセスがありますか?

これが、私たちがあなたに提供できる支援の限界です。これは Oracle の問題ではなく、データベースの特殊性です。あなたはデータを見ることができますが、私たちはできません。ビジネス プロセスを知っているか、知っている必要がありますが、私たちは知りません。

したがって、私たちができることは、いくつかの指針を提供することだけです。

「通常、最初に実行したときに発生し、後で正しい結果が得られます。」

どのようにしてこのパターンを確立しましたか? 「通常」は「常に」と同じです。これを解決するには、さらに精度が必要になります。結果が異なる理由を発見するために、どのような調査を行いましたか? たとえば、このクエリを実行したときに他にどのようなアクティビティが発生しているかを確認しましたか? クエリを実行する前に生データを一覧表示しましたか?

「クエリは数日前にこのように動作し始めましたが、それ以外は完全に機能していました。」

では、数日前に何が変わったのでしょうか。


「請求書は個別に確認済みです」

はい、ただし複数のテーブル結合があります。スプリアス レコードまたは不十分な書き込み状態により、同じレコードが複数回結合される可能性があります。


「バグかもしれない」

おそらく。メジャー バージョンの最初の製品リリースを使用しており、それらはバグが発生しやすいことで有名です。ただし、ポイント ゼロ バージョンであっても、何も変更されていない場合、ソフトウェアが突然バグのある動作を示し始める可能性は低いようです。

しかし、たとえそれがバグであったとしても、その知識は役に立ちません。Oracle 9iR1 のベース リリースを使用しています。これは、10 年以上廃止されている製品のバージョンです。したがって、明らかにあなたの組織はアップグレードに熱心ではなく、おそらくサポートにお金を払っていないため、パッチを適用することはオプションではありません (Oracle がそのような古いソフトウェアのパッチを提供する場合でも、提供しません)。

したがって、それがバグである場合は、自分で追跡して回避策を考え出す必要があります。頑張ってください。

于 2013-08-22T05:59:14.313 に答える
0

customer テーブルまたは sales テーブルに重複があるか、結合が PK にありません。

于 2013-08-30T07:57:46.890 に答える