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

时间:2019-03-17 10:23:04

标签: ms-access access-vba ms-access-2016

问题详细信息:我已经花了整整两天的时间,但仍然找不到解决此问题的方法:

步骤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 个答案:

答案 0 :(得分:0)

您可以基于表中已经存在的最后一个值开始循环。像这样:

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上设置一个复合主键,不允许重复。这样可以保证您的数据一致性。