• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESS 以下のように変更するSQL式を教えて)

Microsoft Accessでテーブルの値を変更するSQL式を教えて

このQ&Aのポイント
  • Microsoft Accessでテーブル(TABLE1)の値を変更するためのSQL式を教えてください。
  • テーブル(TABLE1)には、A,B,Cの3つのフィールドがあり、Aには番号が入っており、Bには数字が、Cには文字が入っています。
  • Aの各値に対してBの値が0以外のレコードのCの値を、Bの値が0のレコードのCの値に変更するSQL式を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • ssvalpha
  • ベストアンサー率66% (2/3)
回答No.3

以下の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では無理なので…

yam2012
質問者

お礼

教えていただきましたSQL式でできました。 これで解決です。 ありがとうございました。

その他の回答 (3)

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.4

こちらTABL0とTABL1間のリレーションシップを除去すると解決しました レコードの並びも元のままです 元TB、TABL1、TABL1の状態を添付します

yam2012
質問者

お礼

>こちら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)
回答No.2

>上記のコードですが、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 -------------------------------------------------------

yam2012
質問者

お礼

>繰返しテスト可能なように、元TBを加え 工夫しましたね。こうしておくことによって 毎回、TABL1を元の状態に手直ししなくても済みます。 >これを修正すると、今度は実行時エラーになってしまいます。 こちらでも同じエラーになります。 TABL0を作成しなくても UPDATEのSQL式の中でできないか考えてみます。 ありがとうございました。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.1

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) ;")

yam2012
質問者

お礼

上記のコードですが、TABLE1(=TABL1)の フィールドAが1で、フィールドBが0でないレコードの フィールドCの値を同じフィールドCの値に変更しているだけなので、 上記のコードでは、TABLE1は何も変わらないはずです。 実際に実行してみましたがTABLE1は何も変化しませんでした。 そちらでは、このコードを実際に実行してみて 質問の「変更後のTABLE1」のようになったのでしょうか。 よろしくお願いします。

関連するQ&A