1

フィールドの 1 つが別のマスター テーブルに存在するかどうかに基づいて、あるテーブルからレコードを削除する削除クエリを作成しようとしています。新しいレコードをデータベースにインポートしている状況ですが、すでにインポートされているレコード、つまりマスター テーブルに既にアカウントがあるレコードを削除したいと考えています。ただし、結合する必要があるフィールドは等しくありません。固定の 3 文字のコード XYZ がプレフィックスとして付けられています。

 tbl_to_import.Account     master_table.Account
 123456                    XYZ.123456
 345678                    XYZ.345678

削除クエリで結合を使用しないようにするために、次のことを試しました。

 Delete tbl_to_import.*
 From tbl_to_import
 Where Exists( Select master_table.Account From master_table 
 Where master_table.Account =  ("XYZ."& tbl_to_import.Account) ) = True;

ただし、クエリは Access でハングアップします。何が間違っているのかわかりません。エラー メッセージは表示されませんが、何も生成されずにクエリが実行され、最終的に停止します。この状況では、tbl_to_import には 2,700 のレコードがあり、master_table には 50,000 のレコードがあります。さらに、ODBC 経由で master_table に接続しています。

最初に、結合を使用して削除を実行する 2 つのクエリを作成しました。tbl_to_import.Account には ID という主キーがあります。1 つのクエリqry_find_existing_accountsは、対応するアカウントが master_table.Account に存在する tbl_to_import の ID 番号を見つけました。

 SELECT DISTINCTROW tbl_to_import.ID AS DELETEID
 FROM tbl_to_import LEFT JOIN master_table 
      ON ("XYZ."& tbl_to_import.Account) = master_table.Account
 WHERE ((("XYZ." & [Account])=[master_table].[Account]));

次に、このクエリを使用して削除クエリを作成しました。

 DELETE DISTINCTROW tbl_to_import.*, tbl_to_import.ID
 FROM tbl_to_import RIGHT JOIN qry_find_existing_accounts 
      ON tbl_to_import.ID =qry_find_existing_accounts.DELETEID
 WHERE (((tbl_to_import.ID)=[qry_find_existing_accounts].[DELETEID]));

クエリqry_find_existing_accountsは正常に機能しました。ただし、削除する 2 番目のクエリを実行しようとすると、次のエラーが発生しました:指定されたテーブルから削除できませんでした。通常、このエラーが発生するのは、一意のレコードのみを選択していないためですが、両方のクエリで DISTINCTROW を使用しました。

私が間違っていることと、私がする必要があることをどのように達成できるかについてのアイデアはありますか?

4

2 に答える 2

1

より単純なネストされた SQL ステートメントを使用します。

Delete tbl_to_import.*
From tbl_to_import
Where "XYZ." & tbl_to_import.Account In
(Select master_table.Account From master_table);

これは、特にアカウント フィールドがインデックス化されている場合は、かなり高速です。

于 2012-09-09T02:08:43.080 に答える
0

クエリを単純化できると思います。ID に基づいて削除します。ID はクエリ内にあります。

DELETE * FROM tbl_to_import 
    WHERE tbl_to_import.ID IN (
        SELECT DISTINCT [DELETED] FROM qry_find_existing_accounts
    )
于 2012-09-09T02:09:20.110 に答える