БД Access обновляет одну таблицу со значением из другой - PullRequest
7 голосов
/ 24 апреля 2009

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

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

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

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

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

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

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

... все равно получаю ту же ошибку.

Ответы [ 3 ]

14 голосов
/ 24 апреля 2009

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

UPDATE inventoryDetails 
INNER JOIN BOM_TEMPLATES ON inventoryDetails.modelNumber = BOM_TEMPLATES.bomModelNumber 
SET inventoryDetails.itemDesc = [bomItemDesc];
3 голосов
/ 27 апреля 2009

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

Ответ таков: синтаксис ACE / Jet SQL не совместим с SQL-92 (даже в режиме запроса ANSI-92!).

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

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

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

0 голосов
/ 24 апреля 2009

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

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

Вот так я бы написал для сервера SQL. Надеюсь, что Access понимает ту же команду.

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