2012-09-09 116 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 
    )