如何使用查询或 VBA & SQL 更新 MS ACCESS 中的表

How to update tables in MS ACCESS with query or with VBA & SQL

我已经使用各种代码和解决方法使我的数据库工作,但效率不高!所以这里有一个问题可以解决我的很多问题:

两个访问 table:Tab01 和 Tab02。两者具有相同的列 headers,但列数不同。暂时搁置主键和 ID,检查内容是否相同 objects 我从每个 table 中选择了 3 列必须相同:日期、地点和时间。

现在如下:

Tab01.column01 contains values in rows 1, 4, 5, 8, 10

Tab01.column02 contains values in rows 2, 3, 10 values

Tab01.column03 contains values in rows 1, 2, 3, 4, 5, 6, 7, 8, 9


Tab02.column01 contains values in the rows 1, 2, 3, 4, 5, 9, 10

Tab02.column02 contains no values

Tab02.column03 contains values in rows 1, 10

如果我想用 Tab02.columnX 中的值补全 Tab01.columnX 中的缺失值(通过使用 3 个值 Date, Time, Place 设置为 ID):

这里该如何进行?使用表格查询?第三个table?使用 VBA & SQL 代码?我选择了包含大量 VBA 代码和 If-Then 语句的方法。完成 table 的值大约需要 30 分钟 (!!!!)。准确的说,一打table,每行大约1000行10列,其中的值是这样的,需要补全。

但无论如何,请继续使用上述两个 table,我正在寻找一种可能更优雅、更快速的方式来更新 Tab01。有人有好的建议吗?非常感谢!

这就是我的 Tab01 和 Tab02 代码的样子:(我将大约 20 -30 用于所有其他 tables!!!!)

Sub CompTabsExmpl()

Dim x As Long, y As Long
Dim xRecsMain As Long, xRecsSub As Long

Dim db As DAO.Database
Dim rsTab01 As DAO.Recordset
Dim rsTab02 As DAO.Recordset

Set db = CurrentDb
Set rsTab01 = db.OpenRecordset("Table01", dbOpenDynaset)
Set rsTab02 = db.OpenRecordset("Table02", dbOpenDynaset)

xRecsMain = DCount("*", "Table01")
xRecsSub = DCount("*", "Table02")

rsTab01.MoveFirst
rsTab02.MoveFirst

For y = 0 To xRecsMain - 1
    
   For x = 0 To xRecsSub - 1
   
      If rsTab01.Fields("fieldDATE") = rsTab02.Fields("fieldDATE") And _
         rsTab01.Fields("fieldTIME") = rsTab02.Fields("fieldTIME") And _
         rsTab01.Fields("fieldPLACE") = rsTab02.Fields("fieldPLACE") And _
         IsNull(rsTab01.Fields(fieldX)) And _
         Not IsNull(rsTab02.Fields(fieldX)) Then

         rsTab01.Edit
         rsTab01.Fields("fieldX") = rsTab02.Fields("fieldX")
         'same for all other fields ....
         'same for all other fields ....
         'same for all other fields ....
         '...
         rsTab01.Update
       End If
      
         rsTab01.MoveNext
   Next
    
         rsTab01.MoveFirst
         rsTab02.MoveNext
    
Next

rsTab01.Close
rsTab02.Close
db.Close

End Sub

好的,到目前为止,我们遇到了这个问题:

获取 table2 中的缺失值并将它们移动到 table1

(但匹配 3 列)。好的,我会为此使用查询生成器 - 它会 运行 非常快。

因此,创建一个新查询。放入两个 table(确保首先放入主要 table(第一个 table)。

现在,进入第 2 个 table。在查询网格中添加左侧 table 的 PK id(我们要更新的主要 table)。

所以,我将对 tblHotels 和 tblHotelsB 进行此操作

我想匹配 FirstName、HotelName、City 和 TRANSFER 两列 HotelTax 和 Description。

那么,查询生成器?从左侧拖动一条连接线 table(始终以正确的方向拖放该线非常重要)。

您现在可以 运行 查询 - 是吗 运行??? (它应该 运行 非常快 - 特别是如果你在每个 table.

的 3 列上建立索引

好的让这个查询工作!!!!!!!

它看起来像这样:

如前所述,双击 PK id(将其放入网格中)。对要复制的所有列执行相同的操作。

现在,右键单击查询构建器中的任何空白区域,然后更改更新查询的查询类型 - 如下所示:

现在,只需在更新表达式中,输入来自 tableB

的字段

你明白了:

注意非常小心 - 更新到(表达式可以是我们想要的任何东西 - 并且还允许您从第二个 table.

开始输入列

当然要备份,这么危险的操作。