访问更新查询:不更新某些行

时间:2019-01-31 22:47:45

标签: sql ms-access sql-update

我使用表 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];

请帮助!

1 个答案:

答案 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)