2009-04-24 3 views
5

Я пытаюсь обновить все записи в одной таблице со значениями, найденными в другой таблице.Access DB обновляет одну таблицу со значением от другого

Я пробовал много версий одного и того же основного запроса и всегда получаю то же сообщение об ошибке:

операции должен использоваться обновляемый запрос .

Любые мысли о том, почему этот запрос не будет работать в Access DB?

UPDATE inventoryDetails as idet 
SET idet.itemDesc = 
(
    SELECT bomItemDesc 
    FROM BOM_TEMPLATES as bt 
    WHERE bt.bomModelNumber = idet.modelNumber 
) 

также попытался это, потому что я понял, что, поскольку вторая таблица имеет несколько записей номер модели для каждого ModelNumber - и мне нужно только первое описание от первой найденной записи для каждого номера модели.

UPDATE inventoryDetails as idet 
SET idet.item_desc = 
(
    SELECT TOP 1 bomItemDescription 
    FROM BOM_TEMPLATES as bt 
    WHERE bt.bomModelNumber = idet.modelNumber 
) 

... все еще получаю ту же ошибку, хотя.

+0

Соединения всегда лучше в качестве отправной точки, чем подзапрос в Access/Jet, потому что они лучше оптимизированы (хотя многие подзапросы хорошо оптимизированы - только не все их типы). –

+1

Сообщение об ошибке «Операция должна использовать обновляемый запрос» может показаться немного странным; Я имею в виду, что (суб) запрос не является частью, которая обновляется, не так ли? Что вам нужно понять, так это то, что в Access-speak все SQL DML упоминаются как «запрос», например. вы получаете народ, говорящий о кажущемся оксюмороне, таком как «запрос на обновление», когда они ссылаются на инструкцию SQL * для обновления. – onedaywhen

+0

... и такие люди на самом деле не виноваты: документация Access поощряет это, используя такую ​​терминологию на всей территории, например. 'append query' означает выражение INSERT INTO * *. – onedaywhen

ответ

10

Вы должны использовать присоединиться

UPDATE inventoryDetails 
INNER JOIN BOM_TEMPLATES ON inventoryDetails.modelNumber = BOM_TEMPLATES.bomModelNumber 
SET inventoryDetails.itemDesc = [bomItemDesc]; 
+1

Спасибо. Я думаю, что я делал UPDATE, SET, INNER JOIN (в этом порядке). – m42

0

попробовать:

update idet 
SET idet.itemDesc = bt.bomItemDesc 
from inventoryDetails as idet 
    inner join BOM_TEMPLATES as bt 
      on bt.bomModelNumber = idet.modelNumber 

Это, как я хотел бы написать это для сервера SQL. Hope Access понимает ту же команду.

+0

Запросы доступа и Sql Server редко имеют одинаковый синтаксис ... –

+0

Доступ зависает, начиная с части FROM. Я попробовал несколько версий, подобных этому. – m42

2

Any thoughts on why this query won't work in Access DB?

Ответ заключается в том, что синтаксис ACE/Jet SQL не соответствует требованиям SQL-92 (даже в режиме ANSI-92 Query Mode!).

Я предполагаю, что ваш является скалярным подзапросом. Эта конструкция просто не поддерживается ACE/Jet.

ACE/Jet имеет свой собственный изворотливый и испорченный синтаксис UPDATE..JOIN, изъяны из-за того, что двигатель не приводит к скаляризации значений JOIN, и он может свободно использовать произвольное значение. Это опять-таки отличается от собственного синтаксиса UPDATE..JOIN SQL Server, но по крайней мере SQL Server поддерживает стандартный скалярный подзапрос в качестве альтернативы. ACE/Jet заставляет вас либо изучать свои причудливые непереносимые способы, либо использовать альтернативный продукт SQL.

Извините, что звук отрицательный: двигатель ACE/Jet является отличным программным обеспечением, но синтаксис UPDATE абсолютно фундаментален и тот факт, что он не был изменен, поскольку стандарт SQL-92 действительно показывает его возраст.

Смежные вопросы