Sql 循环访问和更新条目中的两个记录集
我的数据库中有两个表,分别名为Book和ReferencesNum,它们之间有一对多的关系,其中Book是主表。我想循环遍历这两个记录,当Book中的主键(Title)等于ReferencesNum中具有相同标题的记录时,我想从Book中的记录中获取ID号,并将相同的值放入ReferencesNum中的ID字段中 我想通过使用SQL语句来实现这一点。我得到它的VBA,但我试图使用SQL语句代替 VBA代码:Sql 循环访问和更新条目中的两个记录集,sql,vba,ms-access-2007,Sql,Vba,Ms Access 2007,我的数据库中有两个表,分别名为Book和ReferencesNum,它们之间有一对多的关系,其中Book是主表。我想循环遍历这两个记录,当Book中的主键(Title)等于ReferencesNum中具有相同标题的记录时,我想从Book中的记录中获取ID号,并将相同的值放入ReferencesNum中的ID字段中 我想通过使用SQL语句来实现这一点。我得到它的VBA,但我试图使用SQL语句代替 VBA代码: Sub GoThroughX() Dim db As DAO.Database Dim
Sub GoThroughX()
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Book")
Set rs2 = db.OpenRecordset("ReferencesNum")
rs1.MoveFirst
Do Until rs1.EOF
rs2.MoveFirst
Do Until rs2.EOF
If rs1![Title] = rs2![Title] Then
rs2.Edit
rs2![ID] = rs1![ID]
rs2.Update
End If
rs2.MoveNext
Loop
rs1.MoveNext
Loop
rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing
Set db = Nothing
MsgBox "Done"
End Sub
使用SQL:
Sub UpdateX1()
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Book")
Set rs2 = db.OpenRecordset("ReferencesNum")
rs2.MoveFirst
Do Until rs2.EOF
SQLstr = "UPDATE ReferencesDoc " & _
"SET ID = rs1![ID] " & _
"WHERE [Title] = rs1![Title];"
DoCmd.RunSQL SQLstr
rs2.MoveNext
Loop
MsgBox "Done"
End Sub
带有SQL的代码可以工作,但它会不断提示一个框,我必须在其中键入ID和标题,然后它会更改ID值
我如何使它停止询问ID和Title值,而只是自己遍历表,就像VBA代码一样
提前感谢。您需要在此基础上重新评估您的设计。首先,为什么要使用记录集 您正在创建一个O(N^2)进程,通过使用一条SQL语句更新所有记录,您可以将其作为O(1)来完成。如果您打算使用DAO,那么查看DAO.QueryDef对象,而不是DAO.Recordset对象,以完成SQL解决方案 不过,在回答上述问题时,您会收到提示,因为您在引用记录集中的字段时使用了错误的语法,所以Access认为您需要提供一个参数。这已经有很长时间了,但我相信正确的语法是rst(“fieldName”)或使用rst.fields(“fieldName”)引用记录集中的列
但实际上,您希望远离此处的记录集。考虑解决方案,将access warning设置为off: 致意
'With SQL:
Sub UpdateX1()
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Tabl1")
Set rs2 = db.OpenRecordset("Tabl2")
'dans un tel cas, ne pas oublier de régler les warnings à false
DoCmd.SetWarnings False
rs1.MoveFirst
Do Until rs1.EOF
rs2.MoveFirst
Do Until rs2.EOF
sqlstr = "UPDATE Tabl2 " & _
"SET fld2 = '" & rs1![fld2] & "'" & _
"WHERE [fld1] = '" & rs1![fld1] & "';"
DoCmd.RunSQL sqlstr
rs2.MoveNext
Loop
rs1.MoveNext
Loop
DoCmd.SetWarnings True
rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing
Set db = Nothing
MsgBox "Done"
End Sub
'使用SQL:
“考虑到记录有限,
'在您的记录集1和记录集2之间
'以这种方式更新,因为仍在运行
“很久了
现在,你可以写更多的泛型了!!!
“祝你好运
Sub UpdateX2()
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim strSQL1 As String
Dim strSQL2 As String
strSQL1 = "SELECT Top 10 fld1, fld2 FROM Tabl1;"
Set db = CurrentDb()
Set rs1 = db.OpenRecordset(strSQL1, dbOpenSnapshot)
Set rs2 = db.OpenRecordset("Tabl2")
'dans un tel cas, ne pas oublier de régler les warnings à false
DoCmd.SetWarnings False
rs1.MoveFirst
Do Until rs1.EOF
rs2.MoveFirst
Do Until rs2.EOF
sqlstr2 = "UPDATE Tabl2 " & _
"SET fld2 = '" & rs1![fld2] & "'" & _
"WHERE [fld1] = '" & rs1![fld1] & "';"
DoCmd.RunSQL sqlstr2
rs2.MoveNext
Loop
rs1.MoveNext
Loop
DoCmd.SetWarnings True
rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing
Set db = Nothing
MsgBox "Done"
End Sub