【问题标题】:VBA SQL - Changing code from 'Insert Into' to 'Update' tableVBA SQL - 将代码从“插入”更改为“更新”表
【发布时间】:2017-05-13 06:22:54
【问题描述】:

我一直在寻找答案,但无法将答案转换为我的特定代码。我有一些作为 INSERT TO 工作的 Access 数据库的代码,但我希望它更新表。将其更改为 UPDATE 后无法运行。

以下代码有效,它的作用是将满足条件的值添加到现有表的开头。但我希望它更新名为“Sonoco2016_xlsx”的表中现有的空白列“O_StateRegion”。我将 INSERT INTO 切换到 UPDATE 的努力失败了。 (请参阅我努力的第二个代码示例)

Private Sub InsertStateRegion()

On Error GoTo InsertRegions_Err

Dim db As Database
Dim rs As Recordset
Dim strSQL As String

Set db = CurrentDb
Set rs = db.OpenRecordset("Select [OriginState] from [Sonoco2016_xlsx];")

rs.MoveFirst
While Not rs.EOF

    strSQL = "UPDATE [Sonoco2016_xlsx] ([O_StateRegion])"
    strSQL = strSQL & " SELECT [StateRegion] FROM [tblStates]"
    strSQL = strSQL & " WHERE [tblStates].[StateAbbrev]='" & rs![OriginState] & "' "

    db.Execute (strSQL), dbFailOnError

rs.MoveNext
Wend
rs.Close
Set rs = Nothing
Set db = Nothing

btnInsertRegions_Exit:
    Exit Sub

InsertRegions_Err:
    MsgBox Err.Description & " in btnInsertRegions"
    Resume btnInsertRegions_Exit

End Sub

以下是我将其转换为 UPDATE 的努力

Private Sub btnInsertRegions_Click()

On Error GoTo InsertRegions_Err

Dim db As Database
Dim rs As Recordset
Dim strSQL As String

Set db = CurrentDb
Set rs = db.OpenRecordset("Select [OriginState] from [Sonoco2016_xlsx];")

rs.MoveFirst
While Not rs.EOF

    strSQL = "UPDATE [Sonoco2016_xlsx] ([O_StateRegion])"
    strSQL = strSQL & " SET [Sonoco2016_xlsx].[O_StateRegion]=[tblStates].[StateRegion]"
    strSQL = strSQL & " WHERE [tblStates].[StateAbbrev] = '" & rs![OriginState] & "' "

    db.Execute (strSQL), dbFailOnError

rs.MoveNext
Wend
rs.Close
Set rs = Nothing
Set db = Nothing

btnInsertRegions_Exit:
    Exit Sub

InsertRegions_Err:
    MsgBox Err.Description & " in btnInsertRegions"
    Resume btnInsertRegions_Exit

End Sub

【问题讨论】:

  • 你能详细说明为什么你的表单不能原生处理这个问题吗?

标签: sql vba ms-access sql-update sql-insert


【解决方案1】:

你想要达到的正确语法是

UPDATE [Sonoco2016_xlsx] 
    INNER JOIN [tblStates]
        ON [tblStates].[StateAbbrev] = [Sonoco2016_xlsx].[OriginState]
SET [Sonoco2016_xlsx].[O_StateRegion]=[tblStates].[StateRegion];

您将在不使用记录集的情况下执行。

但是请注意,这仅在 [StateAbbrev] 具有唯一索引时才有效,例如如果是[tblStates]的主键。否则,更新将不明确。

此外,不能像在set语句中使用子查询

SET [Sonoco2016_xlsx].[O_StateRegion]=(SELECT [StateRegion] 
                                       FROM = [tblStates] 
                                       WHERE [StateAbbrev] = rs![OriginState])

因为UPDATE 语句中禁止子查询。

【讨论】:

  • 非常感谢您的回复! [State Region] 不是主键,因为多个州可以位于该国的同一地区。
  • 我敲的太早了。非常感谢您的回复! [State Region] 不是主键,因为多个州可以位于该国的同一地区。该代码旨在查看表 [Sonoco2016_xlsx] 中的状态,在 [tblStates] 中查找匹配的状态缩写,并将相应状态的 [StateRegion] 返回到 [Sonoco2016_xlsx] 表中的 [O_StateRegion] 字段中。该代码将在用户将 Excel 文件作为表格导入 Access 后运行。在这种情况下,导入的表是 [Sonoco2016_xlsx]
  • 对不起,我的回答有一个小错误,我现在更正了。我的意思是[StateAbbrev] 不是[StateRegion]
  • 谢谢 M. Doerner!我继续使用您的编辑更新了我的代码。我让它看起来像下面,它运行得很好,并将适当的状态放在适当的字段中。再次感谢您的帮助!
【解决方案2】:

感谢 M Doerner,这是对我有用的答案!

Private Sub btnInsertRegions_Click()

On Error GoTo InsertRegions_Err

Dim db As Database
Dim rs As Recordset
Dim strSQL As String

Set db = CurrentDb
Set rs = db.OpenRecordset("Select [OriginState] from [Sonoco2016_xlsx];")

rs.MoveFirst
While Not rs.EOF

    strSQL = "UPDATE [Sonoco2016_xlsx] INNER JOIN [tblStates]"
    strSQL = strSQL & " ON [tblStates].[StateAbbrev] = [Sonoco2016_xlsx].[OriginState]"
    strSQL = strSQL & " SET [Sonoco2016_xlsx].[O_StateRegion]=[tblStates].[StateRegion]"


    db.Execute (strSQL), dbFailOnError

rs.MoveNext
Wend
rs.Close
Set rs = Nothing
Set db = Nothing

btnInsertRegions_Exit:
    Exit Sub

InsertRegions_Err:
    MsgBox Err.Description & " in btnInsertRegions"
    Resume btnInsertRegions_Exit

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2023-04-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2017-11-16
    相关资源
    最近更新 更多