![](/img/trans.png)
[英]MS Access 2007 - Update a Field in a Table with data from another Table
[英]How to update table in MS Access 2007
我正在尝试从临时表更新MS Access 2007中表中的记录。 临时表从外部工具获取新数据。 新数据(2列)应该放入持久表中。
我尝试了以下两个查询,但是当我查看查询的数据表视图时,它们都显示空记录。 (顺便说一句,是否有更好的方法可以在访问中调试SQL?)第二个查询还显示了与table1中一样多的行,而不是仅由外部工具编辑的行数。 (在两种情况下,每一行的结果都是空的)
至少具有正确记录数量的版本:
UPDATE (table1 INNER JOIN table2 ON table1.key = table2.key)
SET table1.value1 = table2.value1, table1.datevalue = table2.datevalue
WHERE ((table1.value1) IS NULL);
该版本的记录数与表1中的记录数相同:
UPDATE table1
SET table1.value1 = (SELECT value1
FROM table2
WHERE ((table1.value1 IS NULL)
AND (table1.key = table2.key))),
table1.datevalue = (SELECT datevalue
FROM table2
WHERE ((table1.key = table2.key)
AND (table1.value1 IS NULL)))
在我的测试工具操纵1分的记录,所以我希望看到一行与从表2 value1和DATEVALUE查询的输出,但输出显示value1和DATEVALUE空项(1或表1(记录量))。
show empty records when I look at the Datasheet view of the Query
如果在表模式下打开“更新查询”,则只会看到单元格的当前值。 您应该运行(执行)查询以更新值。 无法检查更新查询的预览(据我所知)。
为了完全回答您的问题,默认情况下,MS Access .exe程序中的操作查询(包括UPDATE
和INSERT
将引发消息提示,以通知用户将更新或插入多少行以及用户是否要继续执行该操作。 动作查询的其他视图可能不会通知受影响的记录。
如果从以下位置调用操作查询,则会弹出此消息:
!
图标 如果不使用MS Access .exe(因为Access既是应用程序又是数据库),则仍然可以使用DAO的Database.RecordsAffected属性(它是MS Access对象库的一部分)通过代码影响多少条记录。 任何COM界面语言都可以运行相同的进程,包括VBA,Python,PHP,Java等。
VBA示例 (注意:VBA是MS Access和其他Office应用程序的单独组件)
Sub RunUpdate()
Dim db as DAO.Database
Set db = CurrentDb()
db.Execute "mySavedUpdateQuery"
MsgBox CStr(db.RecordsAffected) & " records were affected."
Set db = Nothing
End Sub
Python范例
import os
import win32com.client
access_file = r'C:\Path\To\MyDatabase.accdb'
try:
oApp = win32com.client.Dispatch("Access.Application")
oApp.OpenCurrentDatabase(access_file)
db = oApp.Currentdb()
db.Execute("EmployeesUpdateQ")
print("{} records were affected.".format(db.RecordsAffected))
except Exception as e:
print(e)
finally:
oApp.Quit()
db = None; oApp = None
del db; del oApp
您的两个查询将更新不同数量的记录。 第一个版本在外部级别上保持JOIN
和WHERE
条件,因此将影响table1中记录的过滤数量。
UPDATE (table1 t1 INNER JOIN table2 t2 ON t1.[key] = t2.[key])
SET t1.value1 = t2.value1,
t1.datevalue = t2.datevalue
WHERE ((t1.value1) IS NULL);
第二版本使用具有JOIN
和WHERE
条件的子查询,但在外层没有任何查询,因此table1的所有记录都将受到影响,但是特定值可能会更新为NULL
。 实际上,如果子查询返回多个值,您可能会收到异常错误:
UPDATE table1
SET table1.value1 = (SELECT value1
FROM table2
WHERE ((table1.value1 IS NULL)
AND (table1.[key] = table2.[key]))),
table1.datevalue = (SELECT datevalue
FROM table2
WHERE ((table1.[key] = table2.[key])
AND (table1.value1 IS NULL)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.