在 Access-VBA 中使用 SQL 查询仅创建非重复记录

Posted

技术标签:

【中文标题】在 Access-VBA 中使用 SQL 查询仅创建非重复记录【英文标题】:Create only non-duplicate records using SQL queries in Access-VBA 【发布时间】:2019-03-17 10:23:04 【问题描述】:

问题详情:我花了将近整整两天的时间,仍然无法找到解决此问题的方法:

第 1 步:我有一个名为“table1”的表。它具有三个已填充的字段。我使用 VBA 中的插入 SQL 查询创建了它们:

For n = 1 To .cbo_sbstRep Step 1 
    strsql = "INSERT INTO table1 (A, B, C ) " _
    & "Values (" & .cbo1 & "," & .cbo2 & "," & n & ")"  

    CurrentDb.Execute strsql, dbFailOnError
 Next n

这会在字段 C 中创建值:1、2、3

第 2 步:接下来,我保持 .cbo1(对应的 field_A)和 .cbo2(对应的 field_B)的值相同,并使用组合框更改表 1 中 field_C 的输入变量。在这里,我把它改成了 5。

我希望插入查询再次运行,但不要插入值 1、2 和 3 的记录,因为它们已经存在,而是只创建值 4 和 5。目标表应该在字段 C:1 中有值,最后是2,3,4,5。

【问题讨论】:

【参考方案1】:

您可以根据表中已有的最后一个值开始循环。像这样的:

Dim start as Long

'get last value in column C, taking column A and B into consideration, and increment by 1
start = Nz(DMax("C","Table1", "A=" & .cbo1 & " and B=" & .cbo2), 0) + 1

If start >= .cbo_sbstRep Then

  For n = start To .cbo_sbstRep Step 1 
    strsql = "INSERT INTO table1 (A, B, C ) " _
    & "Values (" & .cbo1 & "," & .cbo2 & "," & n & ")"  

    CurrentDb.Execute strsql, dbFailOnError
  Next n

End If

仅当组合框的值大于 C 列中的最大值时才会运行,将 A 列和 B 列考虑在内。

由于这是一个多对多表,您可以在表A, B and C 中的所有三个字段table1 上设置复合主键,不允许任何重复。这将保证您的数据一致性。

【讨论】:

实际上,它不起作用,因为这是一个多对多组合的联合表,其中存在重复项。此外,Dmax 也无济于事,因为该值还取决于其他两列。 我已根据您的多对多要求更新了答案。在 DMax 函数上添加过滤器。 如果我无法在第一篇文章中解释所有要求,我很抱歉。实际上,另一个问题是有时,DMax 不会有用。由于值可以是 1、3、5 和 2,因此缺少 4。在这种情况下,如果 Combobox 为 6,那么我的代码应该创建 2、4、6。顺便说一句,我已经找到了解决这个问题的方法。我想在这里分享代码,但它不允许粘贴。这是一个很长的代码,在这里输入会很乏味,因为它需要 5 个查询和两个循环。 @Lone 您可以使用您发现的解决方案来回答您自己的问题。你应该可以在里面放很多代码。 @SmrtGrunt 好的,我会试一试,如果可行的话。

以上是关于在 Access-VBA 中使用 SQL 查询仅创建非重复记录的主要内容,如果未能解决你的问题,请参考以下文章

Access-vba复制数据错误

每次战争部署仅创建一次 hsqldb 数据库

如何使用自定义 tf.Estimator 在张量板事件文件中仅创建一份图形副本?

Access-VBA 更改表单中文本的字体和大小

过程声明与 Access-Vba 中具有相同名称的事件或过程的描述不匹配

如何在一个脚本中使用 R 将 SQL 查询中的数据插入到单独的 SQL 查询中?