【问题标题】:Updating values in ms-access table with values from another table用另一个表中的值更新 ms-access 表中的值
【发布时间】:2016-10-21 14:03:29
【问题描述】:

我有一个 Access 2010 数据库,其中包含两个表 T1 和 T2。 我想编写一个更新查询,以便用 T2 中的值更新 T1 中的值。 T2 有额外的字段,而 T1 没有。更新时应忽略这些字段。除了这些字段,T1 和 T2 共享相同的字段和字段名。

由于字段的数量很大(至少 50 个),我试图寻找一个简单的拖放配置查询。我通过将 T1 的主键拖到 T2 的主键来连接设计视图中的两个表。然后我将 T1 的所有字段添加到表格视图下方的数据网格中。

Access 现在希望我选择并输入添加的字段下方的每个字段 ([T2].[fieldname])。我想要实现的是这些信息会自动填写。我怀疑 Access 缺乏如此重要的功能,如果有人指出我正确的方向或提供一些关于为什么这不是更新我的表格的正确方法的见解,我会很感激。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    在更新查询中考虑INNER JOIN:

    UPDATE Table1 t1 
    INNER JOIN Table2 t2 ON t1.ID = t2.ID
    SET 
       t1.Col1 = t2.Col1,
       t1.Col2 = t2.Col2,
       t1.Col3 = t2.Col3,
       ...
    

    但是,为 50 个字段编写 SET 行有点乏味,而且您发现使用设计视图不容易完成。因此,考虑使用 querydef 使用 VBA 以编程方式创建查询,遍历 tabledef 的字段:

    Public Sub CreateUpdateQuery()
        Dim tbl As DAO.TableDef
        Dim qdf As DAO.querydef
        Dim fld As DAO.Field
        Dim strSQL As String
    
        strSQL = "UPDATE Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID SET "
    
        For Each tbl In CurrentDb.TableDefs
            If tbl.Name = "Table1" Then
                For Each fld In tbl.Fields
                    If fld.Name <> "ID" Then
                        strSQL = strSQL & " t1.[" & fld.Name & "] = t2.[" & fld.Name & "],"
                    End If
                Next fld
            End If
        Next tbl
    
        strSQL = Left(strSQL, Len(strSQL) - 1) & ";"                 ' REPLACING LAST COLUMN
    
        For Each qdf In CurrentDb.QueryDefs
            If qdf.Name = "QryName" Then
                CurrentDb.Execute "DROP TABLE " & qdf.Name           ' DELETES QUERY IF EXISTS
            End If
        Next qdf
    
        Set qdf = CurrentDb.CreateQueryDef("QryName", strSQL)  ' SAVES A STORED QUERY
    
        Set tbl = Nothing
        Set qdf = Nothing
    End Sub
    

    【讨论】:

    • 尚未对其进行测试,这似乎是一种完美的方法。我只是很困惑 Access 如何不使用设计器提供此功能,因为可以在两个表之间创建关系。感谢您提供代码和 SQL 查询!
    【解决方案2】:

    我不确定您的尝试有什么问题,但您的目标应该很简单,使用编码更新查询,例如:

    UPDATE T1
    SET T1.col1 = T2.col1,
        T1.col2 = T2.col2,
        T1.col3 = T2.col3,
        [repeat for each field you're updating]
    WHERE T1.pKey = T2.pKey
    

    通过仅包含您要更新的 T1 中的字段,T2 中的额外字段无关紧要。

    【讨论】:

    • 我正在寻找一种不编写查询的方法,它包含所有 50 个字段,这些字段也可能会发生变化。感谢您的努力!
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2020-05-19
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多