【问题标题】:Update table records with VBA SQL on Access with referenced tables使用引用表在 Access 上使用 VBA SQL 更新表记录
【发布时间】:2020-06-23 14:00:49
【问题描述】:

我正在尝试从 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];"

【问题讨论】:

    标签: sql vba ms-access


    【解决方案1】:

    实际上,MS Access 和 MySQL 可能只是两个主要的 RDBMS,它们共享对 UPDATE...JOIN 的相同支持(不像其他支持 UPDATE...FROM 的数据库,如 SQL Server 和 Postgres 或 UPDATE 以及 Oracle、DB2 和SQLite)。

    但是,MS Access 需要一个令人沮丧的功能,即在使用多个 JOIN 的情况下将连接括在括号中的新用户。一些ON 子句表达式可能需要在WHERE 中运行,例如IS NULL。希望 Access 团队在 suggested, future version 中将其更改为符合 ANSI-1992。

    因此,只需调整您的查询即可。还考虑将 SQL 保存为存储查询并在 VBA 中使用DoCmd.OpenQuery 调用它,原因有多种: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"
    

    【讨论】:

    • 我相信CurrentDb().Execute "mySavedUpdateQuery", dbFailOnError 在这种情况下更适合避免那些更新警告。
    • @Correct。由于 OP 没有使用 DoCmd.SetWarnings 调整警告,因此我没有使用您的替代方法。
    【解决方案2】:

    对于我在此处阅读的内容,您很可能需要多个查询,因此我强烈建议您不要创建单个大更新查询,而是执行以下操作

    1-) 使用来自 tblIMPORT 的数据创建一个选择查询,然后将所有表都加入其中。 2-) 将步骤 #1 中的数据插入 tblMAIN 3-) 在 tblMAIN 中运行更新查询,加入您需要添加信息的任何其他表。

    它将简化流程并帮助您组织想法。到最后,您很可能能够将上述 3 个步骤放在 1 或 2 个查询中,但从简单开始。

    【讨论】:

    • 感谢您的回复!您认为创建临时表以逐步扩展所需字段直到我有一个类似于 tblMAIN 的临时表然后只使用该临时表来更新主表会更容易吗?这将是更多的步骤,但似乎它会更可靠。
    • 没错。一步一步地进行,在这个过程结束时,您很可能能够减少一些步骤。
    • 谢谢!所以这通过创建一个临时表来存储 tblIMPORT 的副本,我们在其中添加条目并执行所需的 JOIN。他们从临时表中,我们更新 tblMAIN。
    • 您不需要临时表。如下图,MS Access 支持UPDATE...JOIN。我几乎可以肯定您的原始查询只需要必需的括号。
    猜你喜欢
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多