• ベストアンサー

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

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

  • Oracle
  • 回答数2
  • ありがとう数6

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

  • ベストアンサー
  • 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

  • 重複データの抽出方法(複数項目)

    以下のようなテーブルからc列とd列のデータが重複しているレコードを取得したいために、以下のSQLを試してみました。 a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 02 |01 |01 |01 03 |02 |01 |03 04 |02 |02 |03 05 |01 |01 |02 06 |02 |02 |03 select * from テスト where c in (select c from テスト group by c,d having count(*)>1) and d in (select d from テスト group by c,d having count(*)>1) そうしたところ、以下の結果になってしまいました。 想定では、○のレコードだけ抽出できると思ったのです。 ×のレコードを抽出したくないのですが、SQLのどこが 間違っているのでしょうか? a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 ○ 02 |01 |01 |01 ○ 03 |02 |01 |03 × 04 |02 |02 |03 ○ 06 |02 |02 |03 ○ (使用DB)SQLServer2000

  • accessで重複データの削除について

    accessというよりSQLについてなのかと思いますが、教えていただけないでしょうか。 重複するIDがあり、1件を除いて他のデータを削除してデータを抽出したいです。 抽出条件としては、[年月日]カラムがあるため、日付が一番直近のものを残したいです。  ※こちらも重複しております。 また、[フィルタ]カラムが「2」のレコードのみを対象としたいと思っています。 accessの場合、重複クエリを用いるのかと思い、クエリウィザードから作成しましたが 一意とはなりませんでした。 SELECT テーブル1.[共通ID], テーブル1.[連番], テーブル1.[郵便番号], テーブル1.[住所], テーブル1.[担当者名], テーブル1.[年月日], テーブル1.[フィルタ] FROM テーブル1 WHERE (((テーブル1.[共通ID]) In (SELECT [共通ID] FROM [テーブル1] As Tmp GROUP BY [共通ID] HAVING Count(*)>1 )) AND ((テーブル1.[フィルタ])=2)) ORDER BY テーブル1.[共通ID], テーブル1.[年月日] DESC; distinctも使ってみましたがうまくできませんでした。 何が原因でしょうか。 申し訳ありませんがご教示いただきたくお願いいたします。

  • 重複レコードを高速で取得するSQL

    Access(mdb)から約2万件レコードのあるテーブルがあるとします。 列数は20ほど。 その中から、3つの列において重複しているレコードを取得したいのですが、 高速に取得する方法はありますでしょうか? (VB.NETで、重複レコードをユーザーに示す処理を作成したいのです) 以下のSQLを試したところ、1分以上時間がかかってしまいました。 ----------------------------- SELECT * FROM テーブルA table1 WHERE EXISTS ( SELECT * FROM テーブルA table2 WHERE table1.列A = table2.列A   table1.列B = table2.列B   table1.列C = table2.列C GROUP BY table2.列A HAVING COUNT(table2.列A) > 1 ) ----------------------------- アドバイスをお願いします。

  • 重複レコードの一括削除

    重複データを抽出して、重複しているデータ分だけを一括で削除する事は可能でそうか。 SELECT hoge,count(*) AS count FROM テーブル GROUP BY hoge HAVING count>1 このように出せば重複データを出せたのですが、500件ほどレコードがあり、手作業では辛いです。 お力お貸しくださいませm(_ _)m よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 重複するレコードを調べるSQL

    重複するレコードを調べるSQL 初歩的な質問ですみません! 重複するレコードを調べるために以下のようなSQLを作ったのですが、 遅くて困っています。 もっと速くする方法があれば教えてください! 異なるカテゴリーでも商品コードが重複しているものがないかを探すSQLです。 SELECT A.商品コード, A.X, B.カテゴリー FROM (SELECT COUNT(商品コード) X, 商品コード FROM テーブルA WHERE 追加年月 = 201008 GROUP BY 商品コード) A, (SELECT 商品コード, カテゴリー FROM テーブルA WHERE 追加年月 = 201008 ) B " WHERE A.X >= 2 AND B.商品コード = A.商品コード

  • 重複レコードのある項目を比較し更新する方法

    nameで重複しているレコードをDateの 最新の日のレコードのIDをTGT_IDに入れたいのですが select * from テーブル名 where name in ( select name from テーブル名 group by name having count(*) > 1 ) と重複したカラムを抽出まではできるのですが そこからどうしたらいいのか分かりません どなたかご教授をお願いします。 ID name date tgt_id 1 A 20040403 2 2 A 20040625 2 3 B 20040429 4 4 B 20040623 4

  • 重複レコードの取得

    すみません。。重複レコードの取得方法に困っています。 やりたいのは以下です。 テーブルA 項目1| 項目2| 項目3| 11 | 11 | 01 | 12 | 11 | 02 | 13 | 11 | 04 | 14 | 11 | 04 | 上記の項目1は主キーです。 抽出したいのは下記のみです。 項目1| 項目2| 項目3| 13 | 11 | 04 | 14 | 11 | 04 | 色々SQLを組んで試しては見てるのですが。。。。 select * from テーブル where ((項目3) in (SELECT 項目3 FROM テーブル GROUP BY 項目3 having count(*)>1)) 上記SQLだと項目3を主キーごとにカウントしてるみたいなので 意図した結果が抽出されないのです・・・・・。 項目2と項目3を結合して重複のチェックをすればよいのか?? とも思いますがSQL自体が1本で完結したいので よく分からなくなってしまいました。。。。。 皆さんご教示宜しくお願い致します。

  • sqlで重複チェック

    よろしくお願いします。 会員サイトのマイページにて住所などの情報を更新するページを作成しておりますが、つまづいております。 情報の更新は住所や電話番号なのですが、住所のみを更新する際、電話番号の重複チェックで、 重複チェック用にデータをSELECTした時、自分自身のレコードが含まれているため、自分自身のレコードで重複となってしまい、先に進めません。 WHERE句をうまく利用すればできると思うのですが思いつきません。。。 どのようにSQLを書けばいいのかご伝授ください。

    • ベストアンサー
    • MySQL
  • 不要なwhere文が混じった重複レコードのカウント

    下記のSQL文があります。 tableA内で、tableA.id(A.id)は重複があります。 tableA内でのtableA.id(A.id)の重複レコード数をcount関数などでSELECTしたいのですが、 下記SQL文からどのように付け加えたらいいのか、お分かりの方いますでしょうか? SELECT A.id as id, A.xxx as xx, A.yyy as yy, B.zzz as zz FROM tableA A, tableB B WHERE A.id = B.id AND A.xxx = x AND A.yyy = y なお、「A.yyy = y」という条件は、tableA.idの重複レコード数をカウントする上で必要な条件なのですが、 「A.xxx = x」という条件は、tableA.idの重複レコード数をカウントする上で、不要な条件です。 以上、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 重複項目を取得するSQL分

    SQL分でわからないことがあるので質問させてください。 Aというテーブルに、 番号と処理通番(ユニーク)の2つカラムがあります。 Aテーブルから重複した番号とその処理通番を 上から4件まで取得したいのですが、 ----------------------------- SELECT A.番号,A.処理通番 FROM A INNER JOIN (SELECT 番号 FROM A GROUP BY 番号 HAVING COUNT(*) > 1) AS B ON (A.番号 = B.番号) ORDER BY A.番号,A.処理通番 ----------------------------- のSQLでは重複した番号のデータを 全て取得してしまいます。 番号別に4件まで取得したいのですが、 どのようなSQLを書けば取得できますか? よろしくお願いします。