2009-04-24 67 views
5

我试图用另一个表中的值更新一个表中的所有记录。访问数据库从另一个表中更新一个表的值

我已经试过了相同的基本查询的许多版本,总是得到同样的错误消息:

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

有关为什么此查询无法在Access数据库中工作的任何想法?

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

加入一定和比访问/喷气子查询的起点更好,因为他们是更好的优化(虽然很多子查询优化良好的 - 只是并非所有类型的人)。 – 2009-04-24 20:04:18

+1

失败消息“操作必须使用可更新的查询”可能听起来有点奇怪;我的意思是,(子)查询不是正在更新的部分,对吧?您需要了解的是,在Access中,所有SQL DML都被称为“查询”,例如你会得到一些民间的说法,当他们引用更新的SQL *语句*时,会看到“更新查询”等矛盾。 – onedaywhen 2009-04-27 13:07:26

+0

......并且这样的人不是真的有错:Access文档通过在整个例子中使用这样的术语来鼓励这一点。 'append query'表示INSERT INTO * statement *。 – onedaywhen 2009-04-27 13:10:31

回答

10

你必须使用一个连接

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

尝试:

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

这是我怎么会写它的SQL Server。希望访问理解相同的命令。

2

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

答案是,因为ACE /喷气SQL语法不是SQL-92兼容的(即使在其ANSI-92查询模式!)。

我假设你是一个标量子查询。 ACE/Jet不支持此构造。

ACE /喷气机都有自己的古怪和有缺陷UPDATE..JOIN语法,有缺陷的,因为发动机不强制JOIN ED值是标量,它是免费的默默使用任意值。它与SQL Server自己的UPDATE..JOIN语法不同,但至少SQL Server支持标准标量子查询作为替代。 ACE/Jet迫使您学习其古怪的非便携方式或使用替代SQL产品。

对不起听起来负:在ACE/Jet引擎是一个伟大的软件,但UPDATE语法是绝对重要的,事实上它并没有被自从SQL-92标准的改变确实显示出它的年龄。

相关问题