1

我正在尝试创建一个删除查询以根据另一个主表中是否存在一个字段来从一个表中删除记录。情况是我正在将新记录导入数据库,但我想删除已经导入的记录,在主表中已经有一个帐户。但是,我需要加入的字段并不相等:它以恒定的三字母代码 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。

最初,我使用连接构造了两个查询来执行删除。tbl_to_import.Account 有一个称为 ID 的主键。一个查询qry_find_existing_accounts在 tbl_to_import 中找到了在 master_table.Account 中存在对应帐户的 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工作正常;但是,当我尝试运行第二个查询以删除时,出现错误:无法从指定的表中删除。通常,当我收到此错误时,这是​​因为我没有只选择唯一记录,但是,我在两个查询中都使用了 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);

这应该相当快,尤其是在您的 Account 字段被索引的情况下。

于 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 回答