- ベストアンサー
group byの並び順を変えるだけで結果が異なる原因を考える
- group byの並び順を変えると、MINUS結合の結果が異なることがあります。
- TRUNC関数がGROUP BYの並び順に影響を与えている可能性があります。
- オラクルの障害が原因かもしれません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 うーん、不思議ですね。主キーはなんでしょう? 検証できる環境が手元にないのですが、やはり#1の最後に書いたように MINUS前後を別SQLにして、キー項目だけで考えてみては? SUMをしないでT1.COL5を素直にSELECTさせてみるのが良いと思います。 実は何か別テーブルと結合してるとか?
その他の回答 (1)
- bin-chan
- ベストアンサー率33% (1403/4213)
> 並び順を変えると結果が異なるのですが 何がちがうの?SUMの結果?レコード行数? レコードの行数が異なっても、SUMの総合計は一致しそうなものですが。 > TRUNC(T1.COL4,'MONTH') COLM 日付型の列から '月' を取り出そうとしてるんでしょ。 異なる年or日で同じ月のレコードがあるんじゃない? MINUS前後を別SQLにして、キー項目だけで考えてみては?
補足
解答ありがとうございます。 >何がちがうの?SUMの結果?レコード行数? 異なるのはSUMの結果です。レコード行数は同じです。 元テーブルには、ある同じ年月日でレコードが2件あります。 (例) ------------- COL4 COL5 2011/09/01 100 2011/09/01 200 ------------------ 結果の1つは、合計値(300)を返し、もう1つは片方のみ(100)を返してます。 その為、minusで差分が出てます。 本来、合計値(300)を返してほしい。 >日付型の列から '月' を取り出そうとしてるんでしょ 'MONTH'で指定することで、'年'および'月'で取り出そうとしてます。 ’年月’を基準にしてます。 もっとも分からないのは、結局group byの項目順番を変えてるだけなんですが、 それが結果に影響する事があるのでしょうか?
お礼
ご回答ありがとうございます。 最終的には、SQLを色々つくりかえる事にしました。 どうも、ありがとうございました。
補足
ご回答ありがとうございます。 >うーん、不思議ですね。主キーはなんでしょう? SELECTで抽出している項目の一部が主キーです。 COL1、COL2など。 >MINUS前後を別SQLにして、キー項目だけで考えてみては? MINUS結合前後を別々にして、 INSERT SELECT ・・ で、それぞれ別々のテーブルに出力しましたが、 それぞれのテーブルを見ると差分があります。 たた、SELECTした結果をそのままオブジェクトブラウザーなどで見ると、 登録した時に差分のあったデータに対して、差分がなくなりました。 つまり、MINUSやINSERT SELECTでは差分があるが、 データを直接見ると、該当データには差分がなかった。 それと、もう1点 minus結合の前後で、where 句で差分のあるデータのみに絞って minus結合すると差分がなくなります。 つまり全体では、差分が発生するのに、 差分のあるデータのみに絞ってminus結合すると差分がなくなる。 (出力結果が非常に不安定で、なぜこのように変わるのか分かりません) SUMしないでSELECTする件ですが、試せていません。次回試します。 >実は何か別テーブルと結合してるとか? 他のテーブルとも結合してます。 SQLは抽出項目などももう少し多く、長いため、簡略化して書いてました。 結合ですが、exists結合を2つしてます。 ----(抜粋)----- FROM TABLE1 T1 WHERE EXISTS (SELECT 1 FROM TABLE2 T2) WHERE T1.COL1 = T2.COL1 AND T2.DAT2 = 'xxx') EXISTS (SELECT 1 FROM TABLE2 T2 ,TABLE3 T3) WHERE T1.COL2 = T3.COL2 AND T1.COL3 = T2.COL3 AND T2.DAT3 BETWEEB 'a001' AND 'a009' ----------------