gpt4 book ai didi

sql - 将查询中的数据插入表时,查询是否针对插入的每条记录运行?

转载 作者:行者123 更新时间:2023-12-04 23:51:13 26 4
gpt4 key购买 nike

我将有问题的数据插入表中。当我从另一个表中执行此操作时,它很快,如果有很多记录,只会稍微减慢。即使这样,也只是几秒钟的事情。

当我从查询插入表时,它会进入几分钟 - 每插入 1,000 条记录大约需要一分钟。

源查询本身,当仅作为选择查询运行时,可能需要 1 - 2 秒。查询是否针对插入的每条记录运行?我希望它会为整个数据集运行一次。或者与从另一个表中插入“平面”数据相比,是否还有其他原因导致函数运行如此缓慢。

我使用的 VBA 相当无害:

CurrentDb.Execute "SELECT [Extra Value Concatenation].* _
INTO [" & strTableName & "] FROM [Extra Value Concatenation];"

源查询如下 - 它使用 Allen Browne's Concatenate function .
SELECT [Extra Fields - Fee Protection Insurance Concatenate].ContactID,
ConcatRelated('[Fee Protection Insurance]',
'[Extra Fields - Fee Protection Insurance Concatenate]',
'ContactID = ' & [ContactID])
AS [Fee Protection Insurance]
FROM [Extra Fields - Fee Protection Insurance Concatenate];

编辑:回答 Fionnuala 的评论,但我无法在评论中正确格式化。

使用虚构数据,这大致就是我想要的。

T1 包含客户记录。
ContactID    Name
1 Example Limited
2 Another Company Limited

T2 包含额外的字段。 ContactID 作为外键存在,如果保存多条记录,可能会重复。
ContactID    FieldValue
1 Value 1
1 Value 2
2 Value 3
2 Value 4
2 Value 5

当我离开加入表格时,出现了 T2 的重复项,所以我得到了
ContactID    Name                       FieldValue
1 Example Limited Value 1
1 Example Limited Value 2
2 Another Company Limited Value 3
2 Another Company Limited Value 4
2 Another Company Limited Value 5

当我想要的是
ContactID    Name                       FieldValue
1 Example Limited Value 1; Value 2
2 Another Company Limited Value 3; Value 4; Value 5

因此,连接临时表中的数据似乎是一个好主意,但会减慢一切。我应该以另一种方式查看我的查询吗?

最佳答案

我已经编写了一个非常基本的模块,与您当前的流程相比,它应该可以非常快速地为您完成这项工作。请注意,您需要在项目导航 Pane 中将您的项目重命名为“数据库”以外的名称才能正常工作

我假设 table1 和 table2 和你上面的一样
table3 只是表 1 中所有记录的列表,其中包含要添加的空白“FieldValues”字段
所需的“value1,value2”等。这应该会导致 Table3 填充有您想要的结果

重要提示:对于使用记录集 .edit 和 .update 功能的任何人,请确保您删除 Access 选项菜单中的记录级别锁定,它可以在 Access 选项的“客户端设置”部分下找到,否则将导致您的极度膨胀在压缩和修复数据库之前,file as access 不会删除记录锁。一旦达到 Windows 的 2gb 限制,这可能会导致您的数据库变得不可恢复。

Function addValueField()

'Declarations
Dim db As Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim qry As String
Dim value As String
Dim recordcount as Long


Set db = CurrentDb()

'Open a select query that is a join of table 1 and table 2
'I have made Contact ID a foreign key in the second table
qry = "SELECT Table1.[Contact ID], Table1.Name, Table2.FieldValue FROM Table1 INNER JOIN Table2 ON Table1.[Contact ID] = Table2.[Contact ID(FK)] ORDER BY [Contact ID];"

Set rs1 = db.OpenRecordset(qry, dbOpenDynaset)


'Table 3 was filled with each record from table1, with a 3rd "Field Value" field to
'be filled with your Value 1, Value 2 etc.
qry = "SELECT * FROM Table3 ORDER BY [Contact ID]"

Set rs2 = db.OpenRecordset(qry, dbOpenDynaset)

'Ensure you have enough file locks to process records
recordcount = rs1.recordcount
DAO.DBEngine.SetOption DAO.dbMaxLocksPerFile, recordcount + 1000

rs1.MoveFirst
rs2.MoveFirst

'Here we test to see if "Name" is the same in both recordsets, if it is, add the FieldValue
'to the FieldValue in Table3, otherwise move to the next record in table 3 and compare again


Do While Not rs1.EOF
If IsNull(rs2![FieldValue]) = True Then
If rs2![FieldValue] = "" Then
rs2.Edit
rs2![FieldValue] = rs1![FieldValue]
rs2.Update
rs1.MoveNext
Else
rs2.Edit
rs2![FieldValue] = rs2![FieldValue] & "; " & rs1![FieldValue]
rs2.Update
rs1.MoveNext
End If
Else
rs2.MoveNext
End If
Loop
rs1.close
rs2.close
db.close
set db = nothing
set rs1 = nothing
set rs2 = nothing

End Function

关于sql - 将查询中的数据插入表时,查询是否针对插入的每条记录运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21758073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com