MS Access 替換整個表格內容
**資訊:**我正在為一個小團隊(約 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