- ベストアンサー
Microsoft Accessでテーブルの値を変更するSQL式を教えて
- Microsoft Accessでテーブル(TABLE1)の値を変更するためのSQL式を教えてください。
- テーブル(TABLE1)には、A,B,Cの3つのフィールドがあり、Aには番号が入っており、Bには数字が、Cには文字が入っています。
- Aの各値に対してBの値が0以外のレコードのCの値を、Bの値が0のレコードのCの値に変更するSQL式を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
以下のSQLでどうでしょう。キーワードは「自己結合」 UPDATE TABLE1 as t INNER JOIN TABLE1 as f ON (t.A = f.A and f.B=0) SET t.C = f.C; 本来なら副問い合わせで作りたいところですが、Accessでは無理なので…
その他の回答 (3)
- chayamati
- ベストアンサー率41% (260/624)
こちらTABL0とTABL1間のリレーションシップを除去すると解決しました レコードの並びも元のままです 元TB、TABL1、TABL1の状態を添付します
お礼
>こちらTABL0とTABL1間のリレーションシップを除去すると解決しました リレーションを設定したら解決したというのではなくて、 リレーションを解除したら解決したということですね。 ということは、回答No2の時点で、 TABL1とTABL0との間に何らかのリレーションが 設定されていたのでしょうか。 TABL1.c = select TABL0.c ・・・ の部分で構文エラーになっているので、 リレーションの設定は関係ないように思うのですが? 教えて頂きました insert into TABL0(a,b,c) select a,b,c from TABL1 where TABL1.b=0; update TABL1 inner join TABL0 on TABL1.a = TABL0.a set TABL1.c = select TABL0.c where TABL1.B > 0; のSQL式で、chayamatiさんがしたかったのは以下のような処理ではないでしょうか。 UPDATE TABL1 INNER JOIN (select a,b,c from TABL1 where TABL1.b=0) AS TABL0 ON TABL1.a = TABL0.a SET TABL1.c = TABL0.c No3の回答者様の回答でこの問題は解決しましたのでこれでクローズさせていただきます。 いろいろ調べていただきましてありがとうございました。
- chayamati
- ベストアンサー率41% (260/624)
>上記のコードですが、TABLE1(=TABL1)の フィールドAが1で、フィールドBが0でないレコードの フィールドCの値を同じフィールドCの値に変更しているだけなので、 上記のコードでは、TABLE1は何も変わらないはずです。 実際に実行してみましたがTABLE1は何も変化しませんでした。 質問の「変更後のTABLE1」のようになったのでしょうか。 ハイ、仰る通りです。テストコードでした。 修正し実行すると レコードの並び方違います。 C→B→Aの順にソートを掛けると一応なったのですが、 4 0 d 4 4 a の2つのレコードを追加して実行すると 4 4 a が 4 4 dに変わってくれません 見直すとコーディングにエラーがありました。 これを修正すると、今度は実行時エラーになってしまいます。 繰返しテスト可能なように、元TBを加え 元TB→TABL1→TABL0→TABL1を更新の流れにしました 以下にコードの全容を記述します この3つのテーブルは主キーなしですが、 TABL0.Aを主キーにしたり インデックスプロパティー重複なし エラーは解消されません ----------------------------------------------------------- Option Compare Database Private Sub Form_Load() DoCmd.SetWarnings True DoCmd.RunSQL ("delete from TABL1;") DoCmd.RunSQL ("insert into TABL1(a,b,c) select a,b,c from 元TB ;") DoCmd.SetWarnings True DoCmd.RunSQL ("delete from TABL0;") DoCmd.RunSQL ("insert into TABL0(a,b,c) select a,b,c from TABL1 where TABL1.b=0 ;") DoCmd.SetWarnings False DoCmd.RunSQL ("update TABL1 inner join TABL0 on TABL1.a = TABL0.a set TABL1.c = select TABL0.c where TABL1.B > 0 ;") End Sub -------------------------------------------------------
お礼
>繰返しテスト可能なように、元TBを加え 工夫しましたね。こうしておくことによって 毎回、TABL1を元の状態に手直ししなくても済みます。 >これを修正すると、今度は実行時エラーになってしまいます。 こちらでも同じエラーになります。 TABL0を作成しなくても UPDATEのSQL式の中でできないか考えてみます。 ありがとうございました。
- chayamati
- ベストアンサー率41% (260/624)
TABL1をコピペして、キーテーブル「TABL0」を追加しました DoCmd.RunSQL ("delete from TABL0;") DoCmd.RunSQL ("insert into TABL0(a,b,c) select a,b,c from TABL1 where tabl1.b=0 ;") DoCmd.SetWarnings False DoCmd.RunSQL ("update TABL1 set c = TABL1.c where (a=1 and b>0) ;")
お礼
上記のコードですが、TABLE1(=TABL1)の フィールドAが1で、フィールドBが0でないレコードの フィールドCの値を同じフィールドCの値に変更しているだけなので、 上記のコードでは、TABLE1は何も変わらないはずです。 実際に実行してみましたがTABLE1は何も変化しませんでした。 そちらでは、このコードを実際に実行してみて 質問の「変更後のTABLE1」のようになったのでしょうか。 よろしくお願いします。
お礼
教えていただきましたSQL式でできました。 これで解決です。 ありがとうございました。