Ms-Access

MS Access 替換整個表格內容

  • August 17, 2021

**資訊:**我正在為一個小團隊(約 10 人)項目設置一個新的 MS Access 數據庫。有一個表“A”從未被修改,但與基於欄位“標籤號”的另一個表有關係。另一個表“B”包含團隊定期修改的所有動態資訊。每週一次,我們會收到一個新的 Excel 電子表格,其中包含最新的工程導出,其中包含表 A 的全部內容。每週都會添加一些新記錄,而一些記錄將消失。

我的問題是這樣的:

如何替換 A 表的全部內容?我想確保與 B 表的關係保持不變。我可以刪除整個表並從 excel(70000 行)複製/粘貼,或者我可以將 excel 電子表格導入新表,然後使用更新/追加/刪除查詢的組合。(更新以修改現有記錄,追加以添加新的不存在的記錄,刪除以刪除最新電子表格中不再存在的記錄。)

或者其他更好的方法。

請幫忙?

由於 Access 不支持 UPSERT 語義,因此您會遇到以下問題:

插入 … 到 tbl select … from tmp_tbl where not exists (select 1 from tbl where tbl.id = tmp_tbl.id)`

在適當的情況下使用外部連接進行更新和刪除也是如此。

這意味著三個 SQL 語句。

請參閱SO 上的這個問題

編輯:

我建議不要刪除記錄,而是將它們標記為“無效”,這樣您就可以決定如何處理其他表中的標籤(如有必要)。

這是一個兩步過程;UPSERT 和刪除。您可以將它們與呼叫這兩個查詢的 VBA 連結起來。

首先你想UPSERT使用UPDATE LEFT JOIN這樣的:

更新查詢範例

UPDATE A
LEFT JOIN B ON A.ID = B.ID 
SET A.FirstName = [B].[FirstName], 

現在您已經更新了所有記錄並插入了任何失去的記錄,您必須刪除 B 中不存在的記錄。

刪除查詢範例

DELETE A.ID, *
FROM A LEFT JOIN B ON A.ID = B.ID
WHERE B.ID IS NULL

應該只包括 A 中沒有在 B 中找到的WHERE B.ID IS NULL東西。所以它會刪除從 B 中刪除的東西。

現在讓我們在一個事務中同時執行它們,如果遇到錯誤有機會回滾。

Public Sub UpsertExample()
   DAO.DBEngine.BeginTrans
   
   On Error GoTo tran_Err
   
   CurrentDb.Execute "UpdateQueryExample", dbFailOnError   
   CurrentDb.Execute "DeleteQueryExample", dbFailOnError

   DAO.DBEngine.CommitTrans
   
Exit Sub
   
tran_Err:
   
   DAO.DBEngine.Rollback

   MsgBox "Transaction failed. Error: " & Err.Description
End Sub

引用自:https://dba.stackexchange.com/questions/165347