2012-09-09 43 views
1

我想创建一个删除查询来从一个表中删除记录,根据是否有一个字段存在于另一个主表中。情况是我正在将新记录导入到数据库中,但是我想要删除已导入的记录,,即已在主表中拥有一个帐户。然而,我需要加入的字段并不相同:它带有一个固定的三字母代码XYZ前缀。避免加入MS Access删除查询

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; 

但是,查询获取访问挂断了电话。我不确定我做错了什么。我没有收到错误消息,但查询运行时没有产生任何内容,最终我终止了它。在这种情况下,tbl_to_import有2,700条记录,master_table有50,000条记录。另外,我通过ODBC连接到master_table。

最初,我使用连接构造了两个查询来执行删除操作。 tbl_to_import.Account有一个称为ID的主键。一个查询,qry_find_existing_accounts,位于所述ID号码tbl_to_import对此有在master_table.Account存在对应的帐户:

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。

任何想法我做错了什么,我如何能够完成我需要做的事情?

回答

1

我会去用一个简单的嵌套的SQL语句:

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

这应该是相当快的,特别是如果你的帐户字段建立索引。

+0

这很奏效。我所做的加速是使用make table查询创建master_table的本地副本,当我这样做时,我只是删除了字母前缀。我也把帐户作为当地主人的主要关键,而且速度非常快。谢谢! – regulus

0

我认为你可以简化查询;根据ID进行删除,其中的ID在查询中:

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