MS Access 2007 - 同步两个数据库并使用最新时间戳保持记录

帕特里克·梅勒

使用 Access 2007,我有一个主数据库和几个从数据库。假设我有一个简单的表格:候选人。

在主数据库中

Id ;   Name    ;   Birthday   ;   Timestamp
01 ; Henri     ; 01-01-1911   ; 01-01-2017 

在从数据库中

Id ;   Name    ;   Birthday   ;   Timestamp
01 ; Henry     ; 01-01-1911   ; 01-02-2017 

我需要的是,最新的操作记录替换主数据库中的先前记录。在此示例中,从属数据库中的记录将替换主数据库中的记录。

在我当前的解决方案中,我遍历记录集并比较时间戳。它有效,但我想知道是否有更有效和更快的解决方案?也许用SQL?

此致

威尔·乔布斯

假设

我将假设 ID 是所有数据库中的唯一标识符,并且从属数据库中没有主数据库中没有的 ID 否则你会遇到问题,因为 slave1 可能会将 ID 7 分配给“Fred”,而 slave2 可能会将 ID 7 分配给“Thomas”。

联合查询

SELECT ID, Name, Birthday, Timestamp, 1 AS SlaveNum FROM Candidates_Slave1
UNION ALL
SELECT ID, Name, Birthday, Timestamp, 2 AS SlaveNum FROM Candidates_Slave2
UNION ALL
SELECT ID, Name, Birthday, Timestamp, 3 AS SlaveNum FROM Candidates_Slave3
UNION ALL
...

然后我会写一个 group by query off the union query 来获取每个 ID 和它的最大时间戳。

组查询

SELECT ID, max(Timestamp) AS MaxTime FROM UnionQuery

然后将其加入 UnionQuery,并取最小(或最大)SlaveNum(以防多个从站具有相同的最大时间戳)。

加入查询

SELECT GroupQuery.ID, GroupQuery.MaxTime AS Timestamp, min(UnionQuery.SlaveNum) AS SlaveNum
FROM GroupQuery INNER JOIN UnionQuery ON
    GroupQuery.ID = UnionQuery.ID AND
    GroupQuery.MaxTime = UnionQuery.Timestamp;

现在你可以通过再次内部加入UnionQuery来获取最新的(从)数据,并且你可以加入到主Candidates表并比较时间戳。添加一个 WHERE 子句,用于检查主表中小于我们的连接查询的任何时间戳:

完整信息查询

SELECT Candidates_Master.ID, 
    Candidates_Master.Name AS Name_Master,
    Candidates_Master.Birthday AS Birthday_Master, 
    Candidates_Master.Timestamp AS Timestamp_Master, 
    UnionQuery.Name AS Name_Slave, 
    UnionQuery.Birthday AS Birthday_Slave,
    UnionQuery.Timestamp AS Timestamp_Slave
FROM (JoinQuery INNER JOIN UnionQuery 
    ON JoinQuery.ID = UnionQuery.ID AND JoinQuery.SlaveNum = UnionQuery.SlaveNum)
INNER JOIN Candidates_Master ON JoinQuery.ID = Candidates_Master.ID
WHERE Candidates_Master.Timestamp < UnionQuery.Timestamp;

最后,编写更新查询有时会很麻烦,因为严格来说,UPDATE 查询中不应该有 JOIN 子句,但有时 Access 允许您这样做。当您在 Access 中收到“此记录集不可更新”错误时,这篇文章将详细说明。进行更新的 ANSI 方法是这样的:

更新查询

UPDATE Candidates_Master
SET (Name, Birthday, Timestamp) = (SELECT Name_Slave, Birthday_Slave, Timestamp_Slave FROM FullInfoQuery WHERE Candidates_Master.ID = FullInfoQuery.ID)
WHERE EXISTS (SELECT 1 FROM FullInfoQuery WHERE FullInfoQuery.ID = Candidates_Master.ID);

不幸的是,Access 并不完全支持该语法,因此您需要运行如下代码:

更新查询_v2

UPDATE Candidates_Master
SET Name = (SELECT Name_Slave FROM FullInfoQuery WHERE Candidates_Master.ID = FullInfoQuery.ID),
Birthday = (SELECT Birthday_Slave FROM FullInfoQuery WHERE Candidates_Master.ID = FullInfoQuery.ID),
Timestamp = (SELECT Timestamp_Slave FROM FullInfoQuery WHERE Candidates_Master.ID = FullInfoQuery.ID)
WHERE EXISTS (SELECT 1 FROM FullInfoQuery WHERE FullInfoQuery.ID = Candidates_Master.ID);

但是因为它有很多相关的子查询,所以它可能非常缓慢/低效。试试看。一个常见的替代方法(无论如何对我来说)是编写一个 make table 查询将 FullInfoQuery 的结果粘贴到它自己的表中,然后根据该表编写一个 UPDATE 查询,其语法非常简单:

更新查询_v3

UPDATE Candidates_Master INNER JOIN tblFullInfoQuery ON Candidates_Master.ID = tblFullInfoQuery.ID
SET Candidates_Master.Name = tblFullInfoQuery.Name_Slave,
    Candidates_Master.Birthday = tblFullInfoQuery.Birthday_Slave,
    Candidates_Master.Timestamp = tblFullInfoQuery.Timestamp_Slave

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从MS ACCESS 2007数据库提取SSIS 2012数据

来自分类Dev

连接字符串查询MS Visual Studio 2010-MS Access 2007数据库

来自分类Dev

表单验证规则MS-Access 2007

来自分类Dev

MS Access 2007最终用户访问

来自分类Dev

表单验证规则MS-Access 2007

来自分类Dev

将两个查询合二为一,SQL MS Access 2007

来自分类Dev

MS Access 2007使用VBA将单独的表单打开到特定记录

来自分类Dev

MS Access2007:如何使用更新查询更新表中的日期/时间值

来自分类Dev

从MS Access 2007中的不同记录打开窗体的命令按钮

来自分类Dev

MS Access 2007空白表单设计中用于添加记录的表单

来自分类Dev

MS Access 2007数据库应用程序兼容性32位64位问题

来自分类Dev

MS Access 2007错误号:受信任文档上的2950?

来自分类Dev

MS-Access 2007 as EXE-如何维护和调试?

来自分类Dev

MS-Access 2007查询运行时错误

来自分类Dev

无法将记录添加到表单,出现错误“您无法转到指定的记录”。(MS Access 2007-2016年)

来自分类Dev

MS-Access 2007表单在将表单更改为“设计视图”并返回到“表单视图”之前,无法编辑数据

来自分类Dev

MS-Access 2007:查询在另一个字段中具有两个或多个不同值的名称

来自分类Dev

无效使用空值Access 2007

来自分类Dev

MS Access数据库和MySql之间同步

来自分类Dev

将 dateTimePicker 中的日期保存到 ms access 数据库中并搜索两个日期之间的记录

来自分类Dev

MS Word 2007-插入形状,但保持选中该工具

来自分类Dev

MS Access报告结合了多个数据库

来自分类Dev

如何使用MS Word 2007 VBA检查窗口版本

来自分类Dev

在Visual Basic 2010上的INSERT INTO命令上获取语法错误到MS ACCESS 2007

来自分类Dev

是否可以在MS Access 2007+中将列更改为十进制?

来自分类Dev

MS Access 2007-更改复选框为未选中

来自分类Dev

如何避免在MS Access 2007-2013中四舍五入数字?

来自分类Dev

我们可以在MS Access 2007中创建存储过程吗

来自分类Dev

我们如何在 SQL 查询 MS Access 2007 的字段上定义验证规则

Related 相关文章

  1. 1

    从MS ACCESS 2007数据库提取SSIS 2012数据

  2. 2

    连接字符串查询MS Visual Studio 2010-MS Access 2007数据库

  3. 3

    表单验证规则MS-Access 2007

  4. 4

    MS Access 2007最终用户访问

  5. 5

    表单验证规则MS-Access 2007

  6. 6

    将两个查询合二为一,SQL MS Access 2007

  7. 7

    MS Access 2007使用VBA将单独的表单打开到特定记录

  8. 8

    MS Access2007:如何使用更新查询更新表中的日期/时间值

  9. 9

    从MS Access 2007中的不同记录打开窗体的命令按钮

  10. 10

    MS Access 2007空白表单设计中用于添加记录的表单

  11. 11

    MS Access 2007数据库应用程序兼容性32位64位问题

  12. 12

    MS Access 2007错误号:受信任文档上的2950?

  13. 13

    MS-Access 2007 as EXE-如何维护和调试?

  14. 14

    MS-Access 2007查询运行时错误

  15. 15

    无法将记录添加到表单,出现错误“您无法转到指定的记录”。(MS Access 2007-2016年)

  16. 16

    MS-Access 2007表单在将表单更改为“设计视图”并返回到“表单视图”之前,无法编辑数据

  17. 17

    MS-Access 2007:查询在另一个字段中具有两个或多个不同值的名称

  18. 18

    无效使用空值Access 2007

  19. 19

    MS Access数据库和MySql之间同步

  20. 20

    将 dateTimePicker 中的日期保存到 ms access 数据库中并搜索两个日期之间的记录

  21. 21

    MS Word 2007-插入形状,但保持选中该工具

  22. 22

    MS Access报告结合了多个数据库

  23. 23

    如何使用MS Word 2007 VBA检查窗口版本

  24. 24

    在Visual Basic 2010上的INSERT INTO命令上获取语法错误到MS ACCESS 2007

  25. 25

    是否可以在MS Access 2007+中将列更改为十进制?

  26. 26

    MS Access 2007-更改复选框为未选中

  27. 27

    如何避免在MS Access 2007-2013中四舍五入数字?

  28. 28

    我们可以在MS Access 2007中创建存储过程吗

  29. 29

    我们如何在 SQL 查询 MS Access 2007 的字段上定义验证规则

热门标签

归档