Операция должна использовать обновляемый запрос. (Ошибка 3073) Microsoft Access - PullRequest
21 голосов
/ 04 октября 2008

На некоторые запросы Microsoft Access я получаю следующее сообщение: Операция должна использовать обновляемый запрос. (Ошибка 3073). Я работаю над этим, используя временные таблицы, но мне интересно, есть ли лучший способ. Все задействованные таблицы имеют первичный ключ. Вот код:

UPDATE CLOG SET CLOG.NEXTDUE = (
    SELECT H1.paidthru 
    FROM CTRHIST as H1
    WHERE H1.ACCT = clog.ACCT AND
    H1.SEQNO = (
        SELECT MAX(SEQNO) 
        FROM CTRHIST 
        WHERE CTRHIST.ACCT = Clog.ACCT AND 
        CTRHIST.AMTPAID > 0 AND
        CTRHIST.DATEPAID < CLOG.UPDATED_ON
    )
)
WHERE CLOG.NEXTDUE IS NULL;

Ответы [ 21 ]

23 голосов
/ 05 октября 2008

Начиная с Jet 4, все запросы, имеющие соединение с оператором SQL, который суммирует данные, не подлежат обновлению. Вы не используете JOIN, но предложение WHERE в точности эквивалентно соединению, и, таким образом, оптимизатор запросов Jet обрабатывает его так же, как и объединение.

Боюсь, что вам не повезло без временной таблицы, хотя, может быть, кто-то с большим знанием Jet SQL, чем я, может найти обходной путь.

Кстати, он мог быть обновляемым в Jet 3.5 (Access 97), так как множество запросов было обновляемым, а затем не обновлялось после обновления до Jet 4.

-

7 голосов
/ 10 мая 2012

У меня была похожая проблема, когда следующие запросы не работали;

update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = (select LGA.LGA_NAME from tbl_Prop_LGA as LGA where LGA.LGA_CODE = LVD.LGCode)
where LVD.LGAName is null;

update tbl_LOT_VALUATION_DETAILS inner join tbl_prop_LGA on tbl_LOT_VALUATION_DETAILS.LGCode = tbl_prop_LGA.LGA_CODE 
set tbl_LOT_VALUATION_DETAILS.LGAName = [tbl_Prop_LGA].[LGA_NAME]
where tbl_LOT_VALUATION_DETAILS.LGAName is null;

Однако использование DLookup решило проблему;

update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = dlookup("LGA_NAME", "tbl_Prop_LGA", "LGA_CODE="+LVD.LGCode)
where LVD.LGAName is null;

Это решение было первоначально предложено на https://stackoverflow.com/questions/537161/sql-update-woes-in-ms-access-operation-must-use-an-updateable-query

4 голосов
/ 06 декабря 2013

В коде нет ошибок. Но ошибка выбрасывается по следующей причине.

 - Please check weather you have given Read-write permission to MS-Access database file.

 - The Database file where it is stored (say in Folder1) is read-only..? 

предположим, что вы храните базу данных (файл MS-Access) в папке, доступной только для чтения, при запуске приложения соединение не открывается принудительно. Следовательно, измените разрешение файла / разрешение на содержащую его папку, как в C:\Program files для всех большинства всех дисков c установлен только для чтения , поэтому изменение этого разрешения решает эту проблему.

4 голосов
/ 08 октября 2008

Проблема определенно связана с использованием (в данном случае) функции max (). Любая функция агрегации, используемая во время объединения (например, для получения значения max, min или avg из объединенной таблицы), вызовет ошибку. То же самое относится и к использованию подзапросов вместо соединений (как в исходном коде).

Это невероятно раздражает (и неоправданно!), Так как это довольно распространенная вещь, которую хочется делать. Мне также пришлось использовать временные таблицы, чтобы обойти это (вытянуть агрегированное значение во временную таблицу с помощью оператора вставки, затем присоединиться к этой таблице с вашим обновлением, а затем удалить временную таблицу).

Glenn

3 голосов
/ 25 февраля 2015

Я знаю, что мой ответ опоздал на 7 лет, но в любом случае вот мое предложение:

Когда Access жалуется на запрос UPDATE, который включает JOIN, просто сохраните запрос со свойством RecordsetType, установленным в Dynaset (Inconsistent Updates).

Это иногда позволяет обновлению работать.

2 голосов
/ 19 декабря 2011

Я бы попытался создать запрос ОБНОВЛЕНИЕ в Access. У меня был запрос ОБНОВЛЕНИЯ, который я написал себе как

UPDATE TABLE1
SET Field1 = 
(SELECT Table2.Field2
 FROM Table2
 WHERE Table2.UniqueIDColumn = Table1.UniqueIDColumn)

Запрос дал мне ту ошибку, которую вы видите. Это работало на моем SQL Server, но, как и в предыдущих ответах, синтаксис Access UPDATE не является стандартным. Однако, когда я перестроил его с помощью мастера запросов Access (он использовал синтаксис JOIN), он работал нормально. Обычно я просто выполняю запрос UPDATE для использования не-JET-синтаксиса, но одной из таблиц, к которым я присоединился, была локальная таблица доступа.

2 голосов
/ 16 января 2013

Это происходит, когда для обновляемых таблиц нет УНИКАЛЬНОГО ключа MS-ACCESS. (Независимо от схемы SQL).

При создании ссылок MS-Access на таблицы SQL вам предлагается указать индекс (ключ) во время ссылки. Если это сделано неправильно или не выполняется вообще, запрос к связанной таблице не обновляется

При связывании таблиц SQL в Access УБЕДИТЕСЬ, что когда Access запрашивает индекс (ключ), вы используете именно то, что использует SQL, чтобы избежать проблем, хотя указание любого уникального ключа - это все, что необходимо Access для обновления таблицы. 1005 *

Если вы не были тем человеком, который изначально связывал таблицу, удалите связанную таблицу из MS-ACCESS (ссылка только удаляется) и заново скомпонуйте ее, указав ключ правильно, и все будет работать правильно.

1 голос
/ 04 августа 2014

Мой сбой с простым оператором INSERT. Исправлено при запуске приложения с «Запуск от имени администратора» доступа.

1 голос
/ 25 апреля 2015

MS Access - объединение таблиц в запросе на обновление ... как сделать его обновляемым

  1. Открыть запрос в режиме конструктора
  2. Нажмите один раз на ссылку ч / б таблицы / просмотр
  3. В окне «Свойства» измените значение «уникальных записей» на «да»
  4. Сохраните запрос как запрос на обновление и запустите его.
1 голос
/ 09 июля 2012

У меня была такая же проблема.

Мое решение состоит в том, чтобы сначала создать таблицу из неизменяемого запроса, а затем выполнить обновление из таблицы в таблицу, и это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...