避免加入MS Access删除查询

时间:2012-09-09 02:01:51

标签: sql ms-access

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

 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。

任何想法我做错了什么以及如何完成我需要做的事情?

2 个答案:

答案 0 :(得分:1)

我会使用更简单的嵌套SQL语句:

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

这应该相当快,特别是如果您的帐户字段已编入索引。

答案 1 :(得分:0)

我认为你可以简化查询;基于ID进行删除,ID位于查询中:

DELETE * FROM tbl_to_import 
    WHERE tbl_to_import.ID IN (
        SELECT DISTINCT [DELETED] FROM qry_find_existing_accounts
    )