Access Update Query: не обновляет некоторые строки

1

У меня есть простой запрос на обновление 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];

Пожалуйста помоги!

  • 0
    Я только что заметил это! Спасибо @Uueerdo
Теги:
sql-update
ms-access
access

2 ответа

0

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

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

Казалось бы, существует связь один ко многим между записями в таблице 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)
  • 0
    Об этом я тоже думал, значит ли это, что я должен удалить старые записи? Если это так, мне интересно, почему это сработало раньше.
  • 0
    @Michelle Я обновил свой ответ выше ^^
Показать ещё 6 комментариев
0

Убедитесь, что ваша новая таблица статуса/представление генерируется правильно. Ничего плохого не выглядит с кодом обновления. Образцы данных были бы отличными.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню