使用另一个表中的值更新ms-access表中的值

时间:2016-10-21 14:03:30

标签: sql ms-access

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

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

Access现在要我选择并输入添加字段下方的每个字段([T2]。[fieldname])。我想要实现的是,这些信息会自动填写。我怀疑,Access缺乏这样一个必不可少的功能,并且会感谢有人指出我正确的方向或者提供一些有关为什么这不是更新我的表的正确方法的见解。

2 个答案:

答案 0 :(得分:2)

在更新查询中考虑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以编程方式创建查询,迭代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

答案 1 :(得分:1)

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

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中的额外字段无关紧要。