Поскольку вы заявляете, что:
Каждый месяц, когда я добавляю статус клиентов в таблицу «Новый статус», я не удаляю старые записи.Старый статус остается в таблице на случай, если его необходимо будет отследить.
Казалось бы, существует отношение один ко многим между записями в таблице Client
и записями вNew Status
таблица.
Таким образом, поскольку запрос UPDATE
объединит каждую запись Client
с потенциально несколькими New Status
записями, запись Client
будет обновлена дозначения, хранящиеся в последней записи New Status
, обнаруженной при объединении записей, что необязательно будет последней записью, добавленной в таблицу New Status
.
Если приведенное выше верно, я бы предложил включитьПоле datetime в таблице New Status
, в котором хранится дата, соответствующая моменту добавления такого статуса, а затем выполняется фильтрация запроса 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
имеет поле идентификатора с автоинкрементом, вы можете попробовать следующее, использующее коррелированный подзапрос для выбора записи с помощью t.Наибольшее значение идентификатора для обновления:
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)