比较两个 Access 数据库 VBA - 唯一连接
Posted
技术标签:
【中文标题】比较两个 Access 数据库 VBA - 唯一连接【英文标题】:Compare Two Access Database VBA - Unique Join 【发布时间】:2013-03-24 16:51:03 【问题描述】:需要比较两个访问数据库。 请指导 1.如何使用VBA连接多个数据库 2.如何动态选择连接哪个数据库 3.如何查找匹配是否唯一/如果不是则将结果插入不同的表 4.查询匹配
First Database (Actually set of database files of same type - date wise)
(Called Database 1 for easy understanding):
File Names are :
2013-03-01.mdb
2013-03-02.mdb
2013-03-03.mdb
Each file will have over a million records - Hence speedy comparison required.
Fields
ID RowInfo Description Value Region
Database 2 :
2013-03.mdb
Fields
Table 1 : InvoiceNumber Value CompanyName Date
Table 2 : InvoiceNumber Region
Table 3- Match Result:InvoiceNumber Value ID RowInfo Description CompanyName Date
Table 4- Match Result:InvoiceNumber Value ID RowInfo Description CompanyName Date
对于 Database2 中的每张发票, 在数据库 1 中查找(在日期列中指定的文件中)。 根据 Region 和 Value 在 Database1 中找到对应的匹配项。 如果未提及区域,则仅基于值。 如果未找到匹配项,请同时检查 Date+1 文件。 但必须确保唯一匹配。 没有两个 InvoiceNumber 应该与 Database1 中的同一 ID(在同一日期内)匹配。
对于每个 Invoice ,如果 DB1 中存在唯一匹配,则将结果插入 DB2 的表 3。 如果有多个匹配项(DB1 中单个 Invoice 有多个 ID),则将结果插入表 4。
【问题讨论】:
【参考方案1】:re: 1.如何使用VBA连接多个数据库
在 Access 中,您可以使用链接表 (External Data > Import & Link
) 来操作驻留在另一个数据库文件中的表。事实上,多用户 Access 数据库应始终使用“拆分”数据库格式,其中“后端”文件包含表,“前端”包含其他所有内容(查询、表单、报告等)。前端使用链接表来访问后端的“真实”表。 (请参阅下一点,了解 VBA 如何适应这一点。)
re: 2. 如何动态选择连接哪个数据库
手动方法涉及使用 Access 中的“链接表管理器”将现有表链接“指向”到不同的文件。如有必要,这也可以(毫不奇怪)使用 VBA 自动化,但使用链接表管理器是合乎逻辑的起点。
re: 3. 如何判断匹配是否唯一/如果不匹配则将结果插入不同的表中
如果两个“目标表”具有完全相同的结构,那么您应该考虑只维护一个这样的表,并使用额外的列来区分它包含的记录。在这种情况下,额外的列类似于 [SourceRowCount],其中值 =1 对应于“表 3”,值 >1 对应于“表 4”。您仍然可以通过创建已保存的查询将它们视为查询和报告中的单独“表”...
查询名称:[Invoice_unique_match],条件:“WHERE [SourceRowCount]=1”
查询名称:[Invoice_non_unique_match],条件:“WHERE [SourceRowCount]>1”
...并且仍然在同一个表中保留所有可用记录,以防有时您想要选择(或汇总或报告)记录,而不管它们的“唯一性”状态如何。
【讨论】:
【参考方案2】:在 2013-03-01.mdb 文件中添加来自 2013-03-02.mdb 和 2013-03-03.mdb 数据库的链接表并使用 DLookup 搜索链接表不是更简单吗?
【讨论】:
【参考方案3】:如何使用VBA连接多个数据库
文件 -> 获取外部数据 -> 链接表
如何动态选择要连接的数据库
最好创建一个查询,将所有“数据库 1”数据库中的表联合起来。
如何查找匹配是否唯一/如果不是则将结果插入不同的表中
我想你说你的匹配标准是:
对于 Database2 中的每个 Invoice,在数据库 1 中查找 (在日期列中指定的文件中)。找到对应的匹配项 Database1 基于区域和价值。如果没有提到地区,那么 仅基于价值。如果找不到匹配项,请检查 Date+1 文件 还。但必须确保唯一匹配。没有两个 InvoiceNumbers 应该 与 Database1 中的相同 ID(同一日期内)匹配。
建议代码:
INSERT INTO Table3
WHERE DCOUNT("[InvoiceNumber]", "[big_union_query]", _
"( [Region] = " & [Region] & " AND [Value] = " & [Value] & " ) OR " & _
"( [Region] IS NULL AND [Value] = " & [Value] & " )" _
) = 1;
INSERT INTO Table4
WHERE DCOUNT("[InvoiceNumber]", "[big_union_query]", _
"( [Region] = " & [Region] & " AND [Value] = " & [Value] & " ) OR " & _
"( [Region] IS NULL AND [Value] = " & [Value] & " )" _
) = 1;
要匹配的查询
有几种方法。
一个是编写两个 INSERT 查询,一个用于填充表 3,一个用于填充表 4。
另一种方法是编写一个 VBA 脚本,从“数据库 2”中的发票中执行一个大的 SELECT,遍历它们,并逐个处理它们。 “一对一”的方法会很慢。有很多开销。但它为您提供了控制权并允许您在运行时进行调试。
【讨论】:
以上是关于比较两个 Access 数据库 VBA - 唯一连接的主要内容,如果未能解决你的问题,请参考以下文章
无法从 Excel 中的 VBA 查询连接到 Access 数据库
在 MS Access 中使用 VBA 查看 Combobox 中的唯一值