• ベストアンサー

重複した行と、重複していない行をわけて出力したい。

お世話になります。Oracle9iで、 タイトル通りですが、一つの表から 重複したレコード・重複していないレコード を出力したいのですが、「こうかな?」と思った SELECT文が30分ちかく返ってきません(^^; 他に方法があれば教えて頂きたく質問致しました。 よろしくご教授下さい! (以下のSQLで、重複した行は"exists"で、 重複していない行は"not exists"もしくは "having count(*) = 1"でできるかな? と思ってましたが・・・) テーブル名:結果 キー項目(とみなすカラム):番号・名称・年月日 出力したい項目:結果.データ・もしくは結果.* --データが複数 select a.番号,a.名称,a.年月日,a.データ from 結果 a where exists --キーの重複SELECT ( select 番号,名称,年月日,count(*) from 結果 j where j.年月日 >= '1992/04/01' and j.年月日 <= '1993/03/31' and a.番号= j.番号 and a.名称= j.名称 and a.年月日 = j.年月日 group by j.番号,j.名称,j.年月日 having count(*) > 1 )

質問者が選んだベストアンサー

  • ベストアンサー
  • ctrlzr
  • ベストアンサー率29% (18/62)
回答No.1

キー項目とは、主キーとは違うようですね。30分もかかるのは、SQLのせいではなさそうです。 ・キー項目にインデックスを貼る。 ・データが多いようならアナライズ。 を試してみてください。 sqlで直すなら、以下の点ぐらいです。 select 番号,名称,年月日,count(*) ↓ select 1 existsは、存在するかどうかなので、カラムをselectする必要はありません。 (たぶんオプティマイザが何とかしてくれてると思います^^;

hanahana223
質問者

お礼

早々にご回答ありがとうございます。 ご指摘通りインデックスを作成してリトライしましたが、返ってきませんでした(^^; 対処方(逃げ!?)として、 重複レコードを出力するビュー、 重複していないレコードを出力するビューを作成することにしました。 今回は納期が迫っているため、上記方法で対処しますが、 今度時間がある時に、原因突き止めたいと思います。 ご教授ありがとうございました!

その他の回答 (1)

  • entree
  • ベストアンサー率55% (405/735)
回答No.2

結果テーブルに対して次のようなインデックスは作成されていますか? CREATE INDEX 結果インデックス ON 結果 (番号, 名称, 年月日); 作成されていないようなら作成してみてください。

hanahana223
質問者

お礼

ご回答感謝!です。 今回は「奥の手(逃げの手!?)」で対応しようと 思います。 ありがとうございました!

関連するQ&A