У меня есть простой запрос на обновление Access, используя таблицы Client и New Status.
Каждый месяц, когда я добавляю статус клиентов в таблицу "Новый статус", я не удаляю старые записи. Старый статус остается в таблице на случай, если его необходимо будет отследить.
Каждый месяц я запускаю запрос на обновление, чтобы обновить информацию в таблице клиентов, чтобы отразить новую информацию, если таковая имеется.
Это обновление работало до двух месяцев назад. Перестало обновлять некоторые строки. Я проверил, что обе таблицы содержат соответствующие идентификаторы файлов, а таблица покупок не содержит дубликатов.
Вот мой запрос:
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];
Пожалуйста помоги!
Поскольку вы заявляете, что:
Каждый месяц, когда я добавляю статус клиентов в таблицу "Новый статус", я не удаляю старые записи. Старый статус остается в таблице на случай, если его необходимо будет отследить.
Казалось бы, существует связь один ко многим между записями в таблице 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
имеется поле идентификатора с автоинкрементом, вы можете попробовать следующее, использующее коррелированный подзапрос, чтобы выбрать запись с наибольшим значением идентификатора, используемую для обновления:
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)
Убедитесь, что ваша новая таблица статуса/представление генерируется правильно. Ничего плохого не выглядит с кодом обновления. Образцы данных были бы отличными.