Access Update Query: не обновляет некоторые строки - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть простой запрос на обновление доступа, использующий таблицы Клиент и Новый статус .

  • Клиент - это таблицас информацией о каждом клиенте, включая общую сумму, которую он потратил, и их текущий статус.
  • Новый статус - это таблица, в которой каждый месяц отображается новый статус каждого клиента.

Каждый месяц я добавляю статус клиентов в список Новая таблица , я не удаляю старые записи.Старый статус остается в таблице на случай, если его необходимо будет отследить.

Каждый месяц я запускаю запрос на обновление, чтобы обновить информацию в таблице Client , чтобы отразить новую информацию, если таковая имеется,

Это обновление работало до двух месяцев назад.Перестал обновлять некоторые строки.Я проверил, что обе таблицы содержат соответствующие идентификаторы файлов, а таблица покупок не содержит дубликатов.

Вот мой запрос:

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 голосов
/ 01 февраля 2019

Поскольку вы заявляете, что:

Каждый месяц, когда я добавляю статус клиентов в таблицу «Новый статус», я не удаляю старые записи.Старый статус остается в таблице на случай, если его необходимо будет отследить.

Казалось бы, существует отношение один ко многим между записями в таблице 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...