Access DB使用另一个表的值更新一个表

时间:2009-04-24 19:15:57

标签: sql database ms-access

我正在尝试使用另一个表中的值更新一个表中的所有记录。

我尝试过相同基本查询的多个版本,并始终收到相同的错误消息:

  

操作必须使用可更新的   查询。

有关此查询无法在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 个答案:

答案 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理解相同的命令。