【发布时间】:2021-06-19 17:23:17
【问题描述】:
我已经让我的数据库使用各种代码和解决方法,但效率不高!所以这是一个可以解决我很多问题的问题:
两个 ACCESS 表:Tab01 和 Tab02。两者都有相同的列标题,但列数不同。暂时不考虑主键和 ID,为了检查内容是否相同,我从每个表中选择了 3 列必须相同:日期、地点和时间。
现在如下:
Tab01.column01 包含第 1、4、5、8、10 行中的值
Tab01.column02 包含第 2、3、10 行中的值
Tab01.column03 包含第 1、2、3、4、5、6、7、8、9 行中的值
Tab02.column01 包含第 1、2、3、4、5、9、10 行中的值
Tab02.column02 不包含任何值
Tab02.column03 包含第 1、10 行中的值
如果我想用 Tab02.columnX 中的值完成 Tab01.columnX 中的缺失值(通过使用设置为 ID 的 3 个值 Date、Time、Place):
如何在这里进行?使用表格查询?第三张桌子?使用 VBA 和 SQL 代码?我选择了使用大量 VBA 代码和 If-Then 语句的方式。完成表格的值大约需要 30 分钟 (!!!!)。准确的说是十几张表,每张表大约有1000行10列左右,其中的值看起来像这样,需要补全。
但不管怎样,继续使用上面描述的两个表,我正在寻找一种可能更优雅、更快速的方式来更新 Tab01。有没有人有好的建议?非常感谢!
这就是我的 Tab01 和 Tab02 代码的样子:(我在所有其他表中使用 ca. 20 -30 !!!!)
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
【问题讨论】:
-
好吧,你想要一个所有结果的联合 - 但没有重复。或者您是否需要有代码来检查/防止/查找匹配项?我的意思是您可以构建所有 3 个表的联合查询 - 使用选择不同的行发送结果 - 这将运行得非常快。所以这里的真正目标是个问题。显示没有重复的行,或者查找+搜索以防止重复?当然,通过良好的数据库规范化,我们希望避免在系统中出现这样的重复数据。首先。有一些方法可以绕过 sql 引擎进行 BLISTERING 快速匹配。
-
在我的例子中只有两个表,我想要更新 Tab01(通过 Tab01 中的缺失值,这些值散布在 Tab02 中)。
标签: sql vba ms-access datatables compare