• ベストアンサー

重複しているレコードを一気に削除する方法

重複しているレコードを一気に削除する方法はありますか? 主キー  フィールド1 フィールド2 1     あ     い 2     あ     い のように、主キー以外は重複していえるのですが この場合、1か2を削除する方法はありますか? 一つのテーブルに主キー以外の値が重複しているレコードが多々あるので一気に削除したいです。

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

  • ベストアンサー
  • chayamati
  • ベストアンサー率41% (260/625)
回答No.5

新規に同じフィールドテーブルを作成し 重複を許さないフィールドを主キーにし、元のテーブルを被せます。 主キーは重複を許しません フィールドの組み合わせで重複を許さないのであれば フィールドを隣において複数のフィールドの組み合わせを主キーにします

JMFPRAPPKWDIQ
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

すみません。もう一つありました。 (7) [抽出条件]に、上記(3)のSQL文を使用して、 In SELECT First(テーブル1.主キー) AS 主キーの先頭 FROM テーブル1 GROUP BY テーブル1.フィールド1, テーブル1.フィールド2 HAVING (((テーブル1.フィールド1) In (SELECT [フィールド1] FROM [テーブル1] As Tmp GROUP BY [フィールド1],[フィールド2] HAVING Count(*)>1 And [フィールド2] = [テーブル1].[フィールド2]))) ORDER BY テーブル1.フィールド1, テーブル1.フィールド2) のところで、SQL文の最初のところで、 In SELECT First(テーブル1.主キー) AS 主キーの先頭 となっていますが、正しくは In (SELECT First(テーブル1.主キー) AS 主キーの先頭 です。かっこが抜けていました。したがって、 In (SELECT First(テーブル1.主キー) AS 主キーの先頭 FROM テーブル1 GROUP BY テーブル1.フィールド1, テーブル1.フィールド2 HAVING (((テーブル1.フィールド1) In (SELECT [フィールド1] FROM [テーブル1] As Tmp GROUP BY [フィールド1],[フィールド2] HAVING Count(*)>1 And [フィールド2] = [テーブル1].[フィールド2]))) ORDER BY テーブル1.フィールド1, テーブル1.フィールド2) です。たびたびすみません。

JMFPRAPPKWDIQ
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

やはり、テーブル名の設定に間違いがありました。 B案の(2)のSQL文の SELECT テーブル1.フィールド1, テーブル1.フィールド2, テーブル1.主キー FROM テーブル12 WHERE (((テーブル1.フィールド1) In (SELECT [フィールド1] FROM [テーブル1] As Tmp GROUP BY [フィールド1],[フィールド2] HAVING Count(*)>1 And [フィールド2] = [テーブル1].[フィールド2]))) ORDER BY テーブル1.フィールド1, テーブル1.フィールド2; のところで、 FROM テーブル12 になっていますが、正しくは、 FROM テーブル1 です。 同じくB案の(7)の DELETE テーブル1.主キー FROM テーブル1 WHERE (((テーブル1.主キー) In (SELECT First(テーブル1.主キー) AS 主キーの先頭 FROM テーブル12 GROUP BY テーブル1.フィールド1, テーブル1.フィールド2 HAVING (((テーブル1.フィールド1) In (SELECT [フィールド1] FROM [テーブル1] As Tmp GROUP BY [フィールド1],[フィールド2] HAVING Count(*)>1 And [フィールド2] = [テーブル1].[フィールド2]))) ORDER BY テーブル1.フィールド1, テーブル12.フィールド2))); のところで、 FROM テーブル12 を、 FROM テーブル1 に。 たぶん、もうないとは思いますが。

JMFPRAPPKWDIQ
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

方法はいくつかありますが。 A案 (1) テーブルをもとにすべてのフィールドを表示した 選択クエリを作成。 (2) 集計ボタンをクリックしてグループ化する。 (3) 主キーの[集計]を「先頭」にする。 (4) 主キーの[並べ替え]を「昇順」にする。 (5) これで、クエリを開くと重複した一方のレコードが 削除された形で表示されます。このままでいいのならば このまま使用します。テーブルとして保存したいので あれば、このクエリをデザインビューで開き、 ツールバーの「クエリ」から「テーブル作成」を選択し、 テーブル名を入力し、保存して実行すれば重複した データが除かれたテーブルができます。 B案 テーブルから重複データの一方を直接削除する方法です。 なるべく、ウィザードを利用してできる方法にします。 作成の手順は以下です。なお、テーブル名は 「テーブル1」としています。慣れれば一筆で書けるように なりますが、まずは順序を追って。 (1) クエリの「新規作成」から「重複クエリウィザード」を 選択。 (2) テーブルを選択し、次に「重複を調べるフィールドの選択」 で、フィールド1とフィールド2を選択し、次に 「クエリの結果に表示するその他のフィールドの選択」で 主キーを選択し、適当な名前をつけて保存。 このとき、SQL文は SELECT テーブル1.フィールド1, テーブル1.フィールド2, テーブル1.主キー FROM テーブル12 WHERE (((テーブル1.フィールド1) In (SELECT [フィールド1] FROM [テーブル1] As Tmp GROUP BY [フィールド1],[フィールド2] HAVING Count(*)>1 And [フィールド2] = [テーブル1].[フィールド2]))) ORDER BY テーブル1.フィールド1, テーブル1.フィールド2; のようになっているはずです。 (3) このクエリをデザインビューで開き、集計ボタンをクリックして グループ化し、主キーの[集計]を「先頭」にし、フィールド1と フィールド2の[表示]のチェックをはずしておく。保存。 このとき、このクエリのSQL文は、 SELECT First(テーブル1.主キー) AS 主キーの先頭 FROM テーブル1 GROUP BY テーブル1.フィールド1, テーブル1.フィールド2 HAVING (((テーブル1.フィールド1) In (SELECT [フィールド1] FROM [テーブル1] As Tmp GROUP BY [フィールド1],[フィールド2] HAVING Count(*)>1 And [フィールド2] = [テーブル1].[フィールド2]))) ORDER BY テーブル1.フィールド1, テーブル1.フィールド2; のようになっているはずです。実行すると重複した レコードの一方の主キーが表示されます。 (4) 次に新しいクエリをデザインビューから作り、テーブルを選択。 (5) クエリの種類を「削除クエリ」に変更。 (6) テーブルのフィールドを「主キー」のみを選択。 (7) [抽出条件]に、上記(3)のSQL文を使用して、 In SELECT First(テーブル1.主キー) AS 主キーの先頭 FROM テーブル1 GROUP BY テーブル1.フィールド1, テーブル1.フィールド2 HAVING (((テーブル1.フィールド1) In (SELECT [フィールド1] FROM [テーブル1] As Tmp GROUP BY [フィールド1],[フィールド2] HAVING Count(*)>1 And [フィールド2] = [テーブル1].[フィールド2]))) ORDER BY テーブル1.フィールド1, テーブル1.フィールド2) を貼り付ける。このときSQLビューでは、 DELETE テーブル1.主キー FROM テーブル1 WHERE (((テーブル1.主キー) In (SELECT First(テーブル1.主キー) AS 主キーの先頭 FROM テーブル12 GROUP BY テーブル1.フィールド1, テーブル1.フィールド2 HAVING (((テーブル1.フィールド1) In (SELECT [フィールド1] FROM [テーブル1] As Tmp GROUP BY [フィールド1],[フィールド2] HAVING Count(*)>1 And [フィールド2] = [テーブル1].[フィールド2]))) ORDER BY テーブル1.フィールド1, テーブル12.フィールド2))); のようになっているはずです。このクエリを実行すると、 テーブルから重複した一方のレコードが削除されます。 このSQL文は保存した後、SQLビューを開くとAccess 特有の形に変更される可能性があります。 以上です。どちらかお好み方法で。 文章が長いので誤字脱字があるかもしれません。

JMFPRAPPKWDIQ
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

キー重複してたらすべて消しても良いのですか? 残すレコードのルールは? 私だったら 1)キー重複しているもののうち、残すルールに従ってレコードを検索し、別テーブルとして保存。 2)キー重複レコードをすべて削除 3)1)を戻す それぞれ、レコード件数を把握・記録して検証する ※バックアップ必須ですよ

JMFPRAPPKWDIQ
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A