• ベストアンサー

削除クエリについて

ACCESS2000で開発しています。 現在LOOPで A_TBL と B_TBL を日付とコードでリンクさせ同じデータがあれば削除するという処理をしています。 件数が多いためこれでは時間がかかるため、一括で削除できる削除クエリができないかと考えています。 どなたかご教授お願いします。 <現在のプログラム> SQL="SELECT 年月, コード, 日付 FROM A_TBL AS A INNER JOIN B_TBL AS B ON (A.日付 = B.日付) AND (A.コード = B.コード) WHERE (A.年月='200707')" Set RS = CurrentDb.OpenRecordset(SQL, dbOpenSnapshot) Do While Not RS.EOF SQL= "DELETE * FROM A_TBL WHERE (年月='200707') AND (コード='" & RS!コード & "') AND (日付='" & RS!日付 & "')" CurrentDb.Execute SQL RS.MoveNext Loop RS.Close Set RS = Nothing

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

  • ベストアンサー
noname#140971
noname#140971
回答No.1

ちっと自信がないのですが・・・。 A: ID__コード__日付 _1__A_______2008/01/01 <--- 削除対象 _2__A_______2008/01/02 _3__B_______2008/01/03 B: ID__コード__日付 _1__A_______2008/01/01 _2__A_______2008/01/03 _3__B_______2008/01/04 クエリ1: DELETE A.日付, * FROM A WHERE (((A.日付)=DBLookup("日付","B","コード='" & [A]![コード] & "'"))); で、首尾よく削除対象のみが削除されました。 検証: BテーブルのAのコードに一致する行の日付を取得し、それがAテーブルの日付と同じという条件。 ウーン! 何となく上手くいきそうな感じで実際に上手くいきました。 ここでは Access の DLookup関数ではなく ADO を使った DBLookup関数を利用しています。 大体、3倍速で動作します。 必要とあらば補足します。

noname#208236
質問者

お礼

早々の返事ありがとうございます。 私もあれから色々調べた結果、DISTINCTROW を使用することでできました。 クエリは下記のとおりです。 いかがでしょうか?この使い方正しいですか? 結果としては出来ているのですが自信がなくて… Husky2007さんのも今から試してみます。 DELETE DISTINCTROW A.* FROM A_TBL as A INNER JOIN B_TBL as B ON (B.日付 = A.日付) AND (B.コード = A.コード) WHERE (A.年月='200807')

その他の回答 (1)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

一発で出来る削除クエリは DELETE * FROM A_TBL where exists (select * from B_TBL where (A_TBL.日付 = B_TBL.日付) AND (A_TBL.コード = B_TBL.コード));

関連するQ&A