我正在尝试使用另一个表中的值更新一个表中的所有记录。
我尝试过相同基本查询的多个版本,并始终收到相同的错误消息:
操作必须使用可更新的 查询。
有关此查询无法在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
)
......但仍然遇到同样的错误。
答案 0 :(得分:14)
您必须使用联接
UPDATE inventoryDetails
INNER JOIN BOM_TEMPLATES ON inventoryDetails.modelNumber = BOM_TEMPLATES.bomModelNumber
SET inventoryDetails.itemDesc = [bomItemDesc];
答案 1 :(得分:3)
Any thoughts on why this query won't work in Access DB
?
答案是,因为ACE / Jet SQL语法不符合SQL-92(即使在ANSI-92查询模式下!)。
我假设你的是一个标量子查询。 ACE / Jet不支持这种结构。
ACE / Jet有自己的古怪和有缺陷的UPDATE..JOIN
语法,有缺陷,因为引擎不会强制JOIN
ed值为标量,并且可以自由地使用任意值。它与SQL Server自己的UPDATE..JOIN语法不同,但至少SQL Server支持标准标量子查询作为替代。 ACE / Jet强迫您学习其古怪的非可移植方式或使用其他SQL产品。
很抱歉听起来很消极:ACE / Jet引擎是一个很棒的软件,但UPDATE语法绝对是基础,事实上它自SQL-92标准真正显示它的年龄以来没有被改变。
答案 2 :(得分: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理解相同的命令。