• ベストアンサー

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を応用するとできるのですが、削除クエリで一発する方法はありませんか。 お願いします。

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

  • ベストアンサー
  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.4

こんにちは、No1です 二箇所そのように直して貰えればいいと思います。 バックアップとってから試す癖付けて下さいね。

ticktak
質問者

お礼

大変ありがとうございました。 今後もよろしくお願いします。

その他の回答 (3)

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.3

こんばんは、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 こんな感じです。

ticktak
質問者

お礼

マクロの作成ありがとうございました。 マクロ初体験でしたので、ドキドキしながらやりました。 頂いた方法だと受付日とシリアルNO両方で重複したものを削除するものだったんですね。 これをシリアルNOだけにするために、下のように変えたら思ったようになりました。これで大丈夫ですか。 buf = rs![受付日] & rs![シリアルNO]をbuf = rs![シリアルNO]に変更

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんにちは、No1です 先に提示した処理をマクロで行うか、VBAで処理するかでは?

ticktak
質問者

お礼

もしよろしければマクロ教えていただけないでしょうか。 よろしくお願いします。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは 「削除クエリで一発する方法」は無いかと思います。 重複したレコードのうち、どのレコードを残すか判定する材料(フィールド) が無いとだめでは? Distinctで重複のないデータで新たなテーブルを作成して、元のテーブルは変名し 新たなテーブルを元のテーブル名にするのがバックアップも取れていかと思います。

ticktak
質問者

お礼

ありがとうございます。 どのレコードを残すという判断はせず、エクセルの「重複の削除」のように、とにかく重複しているものをガンガン消すというやり方がないものかと探しています。

関連するQ&A