我有一个包含两个表T1和T2的Access 2010数据库。 我想编写一个更新查询,以便使用T2中的值更新T1中的值。 T2得到了额外的字段,T1没有。更新时应忽略这些字段。除了那些字段,T1和T2共享相同的字段和字段名。
由于字段数量非常大(至少50个),我试图寻找一个简单的拖拽和放大器。删除查询的配置。我通过将T1的主键拖到T2的主键来连接设计视图中的两个表。然后我将T1的所有字段添加到表视图下面的数据网格。
Access现在要我选择并输入添加字段下方的每个字段([T2]。[fieldname])。我想要实现的是,这些信息会自动填写。我怀疑,Access缺乏这样一个必不可少的功能,并且会感谢有人指出我正确的方向或者提供一些有关为什么这不是更新我的表的正确方法的见解。
答案 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中的额外字段无关紧要。