Sql 在MS Access删除查询中避免加入

Sql 在MS Access删除查询中避免加入,sql,ms-access,Sql,Ms Access,我试图创建一个删除查询,根据另一个主表中是否存在一个字段,从一个表中删除记录。这种情况是,我正在将新记录导入数据库,但我希望删除已经导入的记录,即在主表中已经有帐户的记录。然而,我需要加入的字段并不相等:它的前缀是一个恒定的三字母代码XYZ tbl_to_import.Account master_table.Account 123456 XYZ.123456 345678 XYZ.345678 为了避免

我试图创建一个删除查询,根据另一个主表中是否存在一个字段,从一个表中删除记录。这种情况是,我正在将新记录导入数据库,但我希望删除已经导入的记录,即在主表中已经有帐户的记录。然而,我需要加入的字段并不相等:它的前缀是一个恒定的三字母代码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有2700条记录,master_表有50000条记录。此外,我还通过ODBC连接到master_表

最初,我使用连接构造了两个查询来执行删除。tbl_to_import.Account有一个名为ID的主键。一个查询,qry_find_existing_accounts,找到了tbl_to_import中的ID号,主表中存在对应的帐户。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\u find\u现有账户运行良好;但是,当我试图运行第二个要删除的查询时,我得到了错误:无法从指定的表中删除。通常,当我得到这个错误时,这是因为我没有只选择唯一的记录,但是,我在两个查询中都使用了DISTINCTROW


你知道我做错了什么,以及如何完成我需要做的事情吗?

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

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

这应该相当快,尤其是当您的帐户字段被索引时。

我将使用一个更简单的嵌套SQL语句:

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

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

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

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

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

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

这很有效。我所做的加速工作是使用make table查询创建master_表的本地副本,当我这样做时,我只是删除了字母前缀。我还将该帐户作为本地主机的主键,速度非常快。谢谢这很有效。我所做的加速工作是使用make table查询创建master_表的本地副本,当我这样做时,我只是删除了字母前缀。我还将该帐户作为本地主机的主键,速度非常快。谢谢