- ベストアンサー
ACCESS:重複の削除(一意フィールドなし)
下のようなSQLで重複したレコードを削除することができることがわかりました。 テーブル名:TEST DELETE * FROM TEST AS T1 WHERE ID <> (Select Min(ID) From TEST As T2 WHERE T2.受付日 = T1.受付日 And T2.シリアルNO = T1.シリアルNO); しかしIDのように一意のフィールドがないテーブルで重複を消し一意にする方法はありますか。 Distinctを応用するとできるのですが、削除クエリで一発する方法はありませんか。 お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは、No1です 二箇所そのように直して貰えればいいと思います。 バックアップとってから試す癖付けて下さいね。
その他の回答 (3)
- ushi2015
- ベストアンサー率51% (241/468)
こんばんは、No1です。 Sub 削除() Dim db As DAO.Database Dim rs As DAO.Recordset Dim dc As Object Dim buf As Variant Set dc = CreateObject("scripting.dictionary") Set db = CurrentDb Set rs = db.OpenRecordset("TEST") rs.MoveFirst buf = rs![受付日] & rs![シリアルNO] dc.Add buf, buf rs.MoveNext Do Until rs.EOF buf = rs![受付日] & rs![シリアルNO] If Not dc.Exists(buf) Then dc.Add buf, buf Else rs.Delete End If rs.MoveNext Loop MsgBox "削除完了" Set dc = Nothing End Sub こんな感じです。
お礼
マクロの作成ありがとうございました。 マクロ初体験でしたので、ドキドキしながらやりました。 頂いた方法だと受付日とシリアルNO両方で重複したものを削除するものだったんですね。 これをシリアルNOだけにするために、下のように変えたら思ったようになりました。これで大丈夫ですか。 buf = rs![受付日] & rs![シリアルNO]をbuf = rs![シリアルNO]に変更
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは、No1です 先に提示した処理をマクロで行うか、VBAで処理するかでは?
お礼
もしよろしければマクロ教えていただけないでしょうか。 よろしくお願いします。
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは 「削除クエリで一発する方法」は無いかと思います。 重複したレコードのうち、どのレコードを残すか判定する材料(フィールド) が無いとだめでは? Distinctで重複のないデータで新たなテーブルを作成して、元のテーブルは変名し 新たなテーブルを元のテーブル名にするのがバックアップも取れていかと思います。
お礼
ありがとうございます。 どのレコードを残すという判断はせず、エクセルの「重複の削除」のように、とにかく重複しているものをガンガン消すというやり方がないものかと探しています。
お礼
大変ありがとうございました。 今後もよろしくお願いします。