2009-04-24 13 views
5

あるテーブルのすべてのレコードを別のテーブルの値で更新しようとしています。アクセスDBが別のテーブルから値を持つテーブルを更新する

私は同じ基本的なクエリの多くのバージョンを試してみましたが、常に同じエラーメッセージが出てきました:

操作は、更新可能 クエリを使用する必要があります。

このクエリがAccess DBで機能しない理由についてのご意見はありますか?私は第二のテーブルので、各modelnumberための複数のモデル番号のレコードを持っていることに気づいたので

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

ジョインはAccess/Jetのサブクエリよりも常に優れています(多くのサブクエリは最適化されていますが、すべてのタイプではありません)。 –

+1

"操作で更新可能なクエリを使用する必要があります"というエラーメッセージは、少し奇妙に聞こえるかもしれません。つまり、(サブ)クエリは更新されている部分ではありません。あなたが理解する必要があるのは、Access-speakですべてのSQL DMLが「クエリ」と呼ばれていることです。あなたは更新SQL *文*を参照しているときに '更新クエリ'のような見た目の擬態語を言っている人を得ます。 – onedaywhen

+0

...そのような人々は本当に間違っているわけではありません。アクセス文書は、このような用語を使用することによってこれを奨励しています。 'INSERT INTO * statement *'を意味する 'append query'。 – onedaywhen

答えて

10

ジョイン

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

ありがとうございます。 私はUPDATE、SET、INNER JOIN(この順番で)をやっていたと思います。 – m42

0

試してみてください。

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

これは私がSQLサーバのためにそれを書くだろうかです。希望アクセスは同じコマンドを理解しています。

+0

アクセスとSQL Serverのクエリで同じ構文が使用されることはほとんどありません。 –

+0

アクセスはFROM部分から始まります。私はこれに似たいくつかのバージョンを試しました。 – m42

2

Any thoughts on why this query won't work in Access DBを使用する必要がありますか?

答えは、ACE/Jet SQL構文がANSI-92クエリモードの場合でもSQL-92に準拠していないためです。

私はあなたのスカラーサブクエリだと仮定しています。この構文は、ACE/Jetではサポートされていません。

ACE/Jetには、エンジンが強制的にスカラー値を出力することはなく、任意の値を静かに使用できるため、奇妙で欠陥のあるUPDATE..JOIN構文があります。これはSQL Server独自のUPDATE..JOIN構文とは異なりますが、少なくともSQL Serverは標準スカラーサブクエリを代替としてサポートしています。 ACE/Jetでは、移植性に優れた非移植的な方法を学ぶか、代替SQL製品を使用するよう強制します。

ACE/Jetエンジンは素晴らしいソフトウェアですが、UPDATE構文は絶対的に基本的なものであり、SQL-92標準は実際にその年代を示して以来変更されていません。

関連する問題