Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 循环访问和更新条目中的两个记录集_Sql_Vba_Ms Access 2007 - Fatal编程技术网

Sql 循环访问和更新条目中的两个记录集

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

我的数据库中有两个表,分别名为Book和ReferencesNum,它们之间有一对多的关系,其中Book是主表。我想循环遍历这两个记录,当Book中的主键(Title)等于ReferencesNum中具有相同标题的记录时,我想从Book中的记录中获取ID号,并将相同的值放入ReferencesNum中的ID字段中

我想通过使用SQL语句来实现这一点。我得到它的VBA,但我试图使用SQL语句代替

VBA代码:

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