簡體   English   中英

使用引用表在 Access 上使用 VBA SQL 更新表記錄

[英]Update table records with VBA SQL on Access with referenced tables

我正在嘗試從 tblIMPORT 記錄更新 tblMAIN 記錄。 tblIMPORT 上的數據需要從其他表中提取引用以匹配 tblMAIN 上的實際預期記錄。 其他表是 tblEMPLOYEES 和 tblTAXRATES。 我們嘗試通過 SQL 查詢來做到這一點,但似乎我們不能完全正確地獲得查詢。 我們都不知道如何正確構建它,因為幫助我的人是 webdev 並使用 MySQL 並且他的查詢與 MS Access 所期望的不太一樣。

tblIMPORT 上的導入數據與 tblMAIN 的信息並不完全相同,因此必須參考 tblEMPLOYEES 和 tblTAXRATES 才能找到匹配的信息,例如:

  • tblIMPORT 有 [EmpID],它相當於 tblEMPLOYEES 上的 [SeqNumID],我們需要提取 tblMAIN 中需要的 [Employee Name]。
  • 類似地,tblIMPORT 只有 [TaxRegion],但我們需要將其與 tblMAIN 所需的 tblTAXRATES 上相應的 [GST percent]、[PST percent]、[HST percent] 和 [IsCompound] 對齊。

這是我們寫的:

' Update Main Entry Table from Imported Content
DoCmd.RunSQL "UPDATE tblMAIN t " & _
                "INNER JOIN tblIMPORT x ON x.[IsDeleted] IS NULL AND x.[EntryID] = t.[EntryID] " & _
                "LEFT JOIN tblEMPLOYEES e ON x.[EmpID] = e.[SeqNumID] " & _
                "LEFT JOIN tblTAXRATES r ON x.[TaxRegion] = r.[TaxRegion] " & _
                "SET t.[Employee Name] = e.[Employee Name],t.[TaxRegion] = x.[TaxRegion],t.[EntryID] = x.[EntryID],t.[EntryDate] = x.[EntryDate],t.[GST percent] = r.[GST percent],t.[PST percent] = r.[PST percent],t.[HST percent] = r.[HST percent],t.[IsCompound] = r.[IsCompound];"

Actually, MS Access and MySQL are probably only two major RDBMS's that share the same support of UPDATE...JOIN (unlike other databases that support UPDATE...FROM like SQL Server and Postgres or UPDATE with subqueries like Oracle, DB2, and SQLite )。

但是,對於使用多個JOIN的括號中的新用戶,MS Access 需要令人沮喪的功能。 並且一些ON子句表達式可能需要在WHERE中運行,例如IS NULL 希望 Access 團隊在建議的未來版本中對此進行更改,使其符合 ANSI-1992。

因此,只需調整您的查詢即可工作。 還考慮將 SQL 保存為存儲查詢,並使用DoCmd.OpenQuery在 VBA 中調用它,原因有多種:1)無法保存語法錯誤的查詢; 2) 編譯器保存最佳執行計划,以便高效運行多個連接等復雜查詢; 3) 避免串聯 VBA 中的引用字符串。

SQL (另存為新查詢對象)

UPDATE ((tblMAIN t INNER JOIN tblIMPORT x ON x.[EntryID] = t.[EntryID])
        LEFT JOIN tblEMPLOYEES e ON x.[EmpID] = e.[SeqNumID])
        LEFT JOIN tblTAXRATES r ON x.[TaxRegion] = r.[TaxRegion]
SET t.[Employee Name] = e.[Employee Name],
    t.[TaxRegion]     = x.[TaxRegion],
    t.[EntryID]       = x.[EntryID],
    t.[EntryDate]     = x.[EntryDate],
    t.[GST percent]   = r.[GST percent],
    t.[PST percent]   = r.[PST percent],
    t.[HST percent]   = r.[HST percent],
    t.[IsCompound]    = r.[IsCompound]
WHERE x.[IsDeleted] IS NULL;

VBA (無需關閉操作查詢)

DoCmd.OpenQuery "mySavedUpdateQuery"

對於我在這里閱讀的內容,您很可能需要多個查詢,因此我強烈建議您不要創建單個大更新查詢,而是執行以下操作

1-) 使用來自 tblIMPORT 的數據創建一個 select 查詢,並將所有表都加入其中。 2-) 將步驟#1 中的數據插入 tblMAIN 3-) 在 tblMAIN 中運行更新查詢,加入您需要添加信息的任何其他表。

它將簡化流程並幫助您組織您的想法。 到最后,您很可能能夠將上述 3 個步驟放在 1 或 2 個查詢中,但從簡單開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM