如何从一个表中获取大数据并在 VBA 中插入另一个表?

Posted

技术标签:

【中文标题】如何从一个表中获取大数据并在 VBA 中插入另一个表?【英文标题】:How to get bigdata from one table and insert into another in VBA? 【发布时间】:2018-08-27 09:19:55 【问题描述】:

我有一个表格,其中包含关键、英语短语和其他 40 种语言的短语。见下图:

我想通过它的语言列打破这些表的记录,如下图:

我使用以下代码完成此操作:

Sub InsertIntoMasterPhrases()
    Dim objRecordsetMaster As ADODB.Recordset
    Set objRecordsetMaster = New ADODB.Recordset
    Dim objRecordset As ADODB.Recordset
    Set objRecordset = New ADODB.Recordset
    objRecordsetMaster.ActiveConnection = CurrentProject.Connection
    objRecordset.ActiveConnection = CurrentProject.Connection
    objRecordsetMaster.Open ("SELECT [Master Table].* FROM [Master Table];")
    While objRecordsetMaster.EOF = False
        objRecordset.Open ("Select  [SAP_LANGUAGE to LANG].[LANGUAGE NAME],  [SAP_LANGUAGE to LANG].[LANGUAGE] " & _
        "From [SAP_LANGUAGE to LANG]")
        While objRecordset.EOF = False
            key = objRecordsetMaster.Fields("Key").Value
            englishPhrase = objRecordsetMaster.Fields("English Phrase").Value
            language = objRecordset.Fields("LANGUAGE").Value
            translation = objRecordsetMaster.Fields(languageName).Value

            If (GetRecordsExist(CStr(key), CStr(englishPhrase), CStr(language)) = "") Then
                Query = "INSERT INTO [Language Sample](Key,English,Translation,Language)VALUES ('" & key & "','" & englishPhrase & "','" & translation & "','" & language & "');"
                CurrentDb.Execute Query
            End If
            objRecordset.MoveNext
        Wend
        objRecordset.Close
        objRecordsetMaster.MoveNext
    Wend
    objRecordsetMaster.Close
End Sub
//Checking records already exist in table
Function GetRecordsExist(key As String, english As String, language As String) As String
   Dim db As Database
   Dim Lrs As DAO.Recordset
   Dim LGST As String
   Set db = CurrentDb()
   Set Lrs = db.OpenRecordset("SELECT KEY FROM [Language Sample] where KEY='" & key & "' and English='" & english & "' and Language = '" & language & "'")
   If Lrs.EOF = False Then
      LGST = "Found"
   Else
      LGST = ""
   End If
   Lrs.Close
   Set Lrs = Nothing
   GetRecordsExist = LGST
End Function

在主表中,我有 15000 条记录,当它打破 15000 条记录时,它变成 15000 * 40 = 600000。上面的代码每分钟插入近 10000 条记录,几个小时后它挂断了。但它也不会产生任何错误,然后我必须重新启动访问。请帮助我如何以更好的方式做到这一点。

【问题讨论】:

【参考方案1】:

备选方案 1:

使用大型 UNION 查询通过一条 SQL 语句追加许多记录,如下所述:

How to simulate UNPIVOT in Access 2010?

您可能希望将其分成几个块(例如,一次 5 或 10 种语言),否则 Access 可能会阻塞查询。

备选方案 2:

不要为每条记录运行 INSERT 语句,而是使用带有.AddNew 的 DAO 记录集。这在数量级上更快,请参阅此答案: https://***.com/a/33025620/3820271

【讨论】:

我整天都在想这个。 unpivot 和 Addnew 的最佳答案

以上是关于如何从一个表中获取大数据并在 VBA 中插入另一个表?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个表中获取数据并插入到 EF Core 中所需的表中

如何从一个表中获取一列并插入到另一个表中

VBA - 根据另一列在同一行上拉取值

如何从一个表列中获取值,将它们与字符串连接并将它们插入另一个表中?

Sql 从一个表列中选择一个最小值,并在一个 SQL 语句中将结果插入到另一个表列中

利用vba怎样编写将工作表中第三行到最后一行(不确定)的数据复制并插入到另一个工作表的第二行前?