2009-04-24 71 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標準的改變確實顯示出它的年齡。

相關問題