我使用表 Client 和 New Status 对访问进行了简单的更新查询。
每个月我都将客户的状态附加到 New Status 表中,我不会删除旧记录。如果需要回溯,旧状态会保留在表中。
每个月我都会运行一个更新查询来更新 Client 表上的信息,以反映新信息(如果有)。
此更新曾经可以使用到两个月前。它停止更新某些行。我确实验证了两个表都包含相应的文件ID,并且购买表中没有重复项。
这是我的查询:
UPDATE Client INNER JOIN New Status
ON Client.[File ID] = [New Status].[File ID]
SET Client.[Client Status] = [New Status].[Client Status],
[Client].[Added] = [New Status].[Added],
Client.[Paid] = [New Status].[Paid],
Client.[removed] = [New Status].[removed],
Client.[complete] = [New Status].[complete];
请帮助!
答案 0 :(得分:1)
自从您声明:
每个月我都将客户端的状态附加到“新状态”表中,我不删除旧记录。如果需要回溯,旧状态会保留在表中。
Client
表中的记录与New Status
表中的记录之间似乎存在一对多的关系。
这样,由于UPDATE
查询会将每个Client
记录加入到可能的几个 New Status
记录中,因此Client
记录将被更新连接到记录时遇到的最后一个New Status
记录所拥有的值,不一定是添加到New Status
表中的最新记录。
如果上述正确,我建议在New Status
表中包括一个datetime字段,该字段存储与附加此状态的时间相对应的日期,然后过滤UPDATE
查询以仅使用最近一个月的记录,例如类似于:
UPDATE
Client INNER JOIN [New Status] ON Client.[File ID] = [New Status].[File ID]
SET
Client.[Client Status] = [New Status].[Client Status],
Client.[Added] = [New Status].[Added],
Client.[Paid] = [New Status].[Paid],
Client.[removed] = [New Status].[removed],
Client.[complete] = [New Status].[complete]
WHERE
[New Status].[Updated] >= DateSerial(Year(Date()), Month(Date()), 1)
或者,如果您的New Status
表具有自动递增的ID字段,则可以尝试以下操作,该操作使用相关的子查询来选择ID值最大的记录用于更新:
update
client c inner join [new status] n on c.[file id] = n.[file id]
set
c.[client status] = n.[client status],
c.[added] = n.[added],
c.[paid] = n.[paid],
c.[removed] = n.[removed],
c.[complete] = n.[complete]
where not exists
(select 1 from [new status] m where m.[file id] = n.[file id] and m.id > n.id)