- 締切済み
SQLの実行結果が異なる
同一VerのREALとBATCHという二つのD/Bがあります。 実表はREAL側にあり、BATCH側にはREALに向けたD/B linkとremote synonymを実表と同名で作成しています。 REALからもBATCHからも同じように結果が得られるような構成です。 しかし、以下のSQLを両D/Bから実行すると結果が異なります。 実表のあるREALの実行結果が正しく、BATCHでの実行結果(0件)は正しくありません。 D/Blinkやsynonymには問題が無い(SQLで呼び出す各表のcountは正しく返す)ので、SQL文自体に禁じ手のような問題があるような気もしますが、SQLに精通しておらず、また作成者不在のため困っております。 select E.契約番号, A.商品番号, A.購入価格 as 商品明細_購入価格, B.購入価格合計 as 商品情報_購入価格, B.商品明細数 from EIGYO管理情報 E, EIGYO商品管理情報 C, EIGYO商品情報 A, (select 商品番号,sum(購入価格) as 購入価格合計,count(*) as 商品明細数 from EIGYO商品明細 group by 商品番号 ) B where A.商品番号=B.商品番号 and A.購入価格<>B.購入価格合計 and E.契約番号 = C.契約番号 and C.商品番号 = A.商品番号 and E.制御コード IS NULL /
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- 3rd_001
- ベストアンサー率66% (115/174)
>一つ判明したのですが、最後の「and E.制御コード IS NULL」を抜くと結果は同じ(2行選択)になりますが、 >入れると結果に相違(2行選択と無し)が出ます。 >is nullの解釈がremote表の操作だと変わるのでしょうか? >ただ、is nullの対象レコードの結果比較は同じになります。 問題点は絞られましたが、DBリンク経由のシノニムでNull値がかわるとは聞いたことがありません。 以下をお勧めします。 (1)dump(E.制御コード)で、実際の値になにが入っているのかを調査 (2)トレースを取ってOracleサポートへ問い合わせ
- 3rd_001
- ベストアンサー率66% (115/174)
みたところ問題なさそうです。 全部、内部結合なので、テーブルの参照先が間違っていて ちゃんとジョインできていないような気がします。 件数だけではなく、データの中身も同じかチェックしてください。 また、all_synonymsなどで参照先をチェックしてください。 あとはSQLを分解し、個別に実行して問題を切り分けます。 (1)AとCのジョイン select A.商品番号, A.購入価格 from EIGYO商品管理情報 C, EIGYO商品情報 A whereC.商品番号 = A.商品番号 / (2)A・CとEのジョイン select A.商品番号, A.購入価格 from EIGYO管理情報 E, EIGYO商品管理情報 C, EIGYO商品情報 A where E.契約番号 = C.契約番号 and C.商品番号 = A.商品番号 and E.制御コード IS NULL / (3)Bのサブクエリ内 select 商品番号, sum(購入価格) as 購入価格合計, count(*) as 商品明細数 from EIGYO商品明細 group by 商品番号 (4)AとBのジョイン select A.商品番号, A.購入価格 as 商品明細_購入価格, B.購入価格合計 as 商品情報_購入価格, B.商品明細数 from EIGYO商品情報 A, (select 商品番号, sum(購入価格) as 購入価格合計, count(*) as 商品明細数 from EIGYO商品明細 group by 商品番号 ) B where A.商品番号 = B.商品番号 and A.購入価格 <> B.購入価格合計 / どこで結果が異なるのかをチェックし、原因を探しましょう。 ※本当にデータが同一でな場合、トレースを取ってoracleサポートに解析してもらうしかないかもしれません。
補足
提示いただいたSQLの結果はすべて同じ(spool結果の比較)になりました。 synonymは問題ありませんでしたが、念のためD/B linkを別個に作って、 そのD/B link経由のsynonymに再作成して試しても結果に相違が出ました。 一つ判明したのですが、最後の「and E.制御コード IS NULL」を抜くと結果は同じ(2行選択)になりますが、 入れると結果に相違(2行選択と無し)が出ます。 is nullの解釈がremote表の操作だと変わるのでしょうか? ただ、is nullの対象レコードの結果比較は同じになります。
補足
病欠しておりました。 最後の質問です。 local処理とremote処理の順序により条件の順序や解釈が変わってしまうという事はあるのでしょうか? sqlplusで返ってくる結果を見ていると、remoto処理の時は例えば「ブロック単位」のような結果の返し方になります。 「remote処理した結果をlocal側に保持した分だけを処理する」 「それをある一定の単位で全レコード分繰り返す」 local処理では条件を一纏めにして解釈するのが当たり前ですが、remoto処理だとこのルールが崩れる場合があるのでしょうか?