我正在尝试创建一个删除查询,以根据另一个主表中是否存在其中一个字段从一个表中删除记录。情况是我将新记录导入数据库,但我想删除已经导入的记录,即。已经在主表中有一个帐户。我需要加入的字段不相同:它以一个常量三字母代码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。
任何想法我做错了什么以及如何完成我需要做的事情?
答案 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
)