2010-12-30 1 views
0

外部結合データセットまたは派生テーブルからのデータが入っているテーブルをMS-Accessで更新する方法はありますか?私はMSSQLでそれを行う方法を知っていますが、Accessでは常に "操作は更新可能なクエリを使用する必要があります"というエラーを受け取ります。更新されるテーブルは更新可能で、ソースデータは更新不可能です。エラーを読み取った後、マイクロソフトは、クエリが参照整合性に違反したときにエラーが発生したことを通知します。私はこのデータセットが保証しないでしょう。大規模なデータセットを更新しようとすると、この制限は致命的です。また、カスケード更新を有効にすることでこれが救済される可能性があることも読んでいます。テーブル間のこの関係がクエリでのみ定義されている場合、これは可能ですか?今のところ、データセットを一時テーブルに書き込んだ後、内部テーブルを更新テーブルに追加することは私の唯一の解決策です。それは信じられないくらいclunkyです。私はこの線に沿って何かやりたい:私は何OUTER JOINされたテーブルまたは派生テーブルからのUPDATEクエリ

UPDATE Table1 
    LEFT JOIN Table2 ON Table1.Field1=Table2.Field1 
WHERE Table2.Field1 IS Null 
SET Table1.Field1= Table2.Field2 

または

UPDATE Table1 INNER JOIN 
    (
     SELECT Field1, Field2 
     FROM Table2, Table3 
     WHERE Field3=’Whatever’ 
    ) AS T2 ON Table1.Field1=T2.Field1 
SET Table1.Field1= T2.Field2 

答えて

0
UPDATE Table3 
INNER JOIN 
(Table1 INNER JOIN Table2 ON Table1.uid = Table2.uid) 
ON 
(Table3.uid = Table2.uid) 
AND 
(Table3.uid = Table1.uid) 
SET 
Table2.field=NULL; 

されています:3つのテーブル 2を作成した 1.それら 3の間の関係を確立しますクエリビルダを使用してTable2のフィールドを更新しました。

+0

ありがとうございます。残念なことにあなたのソリューションは内部結合を使用し、私の質問は他のタイプの結合についてです。あなたのSQLと私の生産データセットは非常に異なるでしょう。 – Praesagus

0

クエリロジックに問題があるようです。あなたの最初の例では、Field1のTable2を左にジョインしますが、WHERE句に

Table2.Field1 IS NULL 

があります。したがって、これはJOINを作成できないレコードに制限されます。しかし、JOINが存在しないにもかかわらずTable2のデータで表1を更新しようとします。

おそらく、このクエリで何をしようとしているのか説明できますか?

+0

このように左結合を使用すると、データセットが一致するレコードに制限されます。 sqlステートメントは、読んでいるデータセットが内部結合以外のものを持っているレコードを更新するという問題を説明するための例にすぎません。 – Praesagus

1

更新アクセスでは、検索は非常に問題があります。

一時テーブルのアイデアは、唯一のオプションです。

時にはDISTINCTROW宣言を使用して問題を解決します(クエリプロパティ - >一意のレコードを 'はい'にする)、試してみる価値があります。

別のことは、テーブルにエイリアスを使用することですが、これはJETエンジンにも役立つようです。

+1

Jet/ACEがこれらを実行しないのは、クエリオプティマイザが、更新されるレコードの数の点でどのような結果になるかを判断できないためです。 DISTINCTROWはその問題を処理することができますが、Sum()などの集計値に更新しようとしているときは問題を解決しません。エイリアスがクエリオプティマイザを助ける可能性があることはわかりません。その提案についてもっと知りたいと思っています。 –

+0

派生テーブルではなくエイリアス、distinctrow、サブクエリさえしていないようです。 2番目の例ではエイリアスの使用を見ることができますが、無駄に使用することはできません。 ugh。 – Praesagus

関連する問題