みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

お世話になります。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
)

投稿日時 - 2005-04-25 12:14:23

QNo.1351055

すぐに回答ほしいです

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

キー項目とは、主キーとは違うようですね。30分もかかるのは、SQLのせいではなさそうです。
・キー項目にインデックスを貼る。
・データが多いようならアナライズ。
を試してみてください。

sqlで直すなら、以下の点ぐらいです。
select 番号,名称,年月日,count(*)

select 1
existsは、存在するかどうかなので、カラムをselectする必要はありません。
(たぶんオプティマイザが何とかしてくれてると思います^^;

投稿日時 - 2005-04-25 12:49:00

お礼

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

投稿日時 - 2005-04-25 18:19:41

ANo.1

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

結果テーブルに対して次のようなインデックスは作成されていますか?

CREATE INDEX 結果インデックス ON 結果 (番号, 名称, 年月日);

作成されていないようなら作成してみてください。

投稿日時 - 2005-04-25 16:47:03

お礼

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

投稿日時 - 2005-04-25 18:21:25

あなたにオススメの質問