こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ACCESS 以下のように変更するSQL式を教えて

Microsoft Accessで以下のように変更するSQL式を教えてください。
(Windows10 , Access2016)

以下のようにテーブル(TABLE1)には、
A,B,Cの3つのフィールドがあり
Aには番号が入っています。重複した番号もあります。
Bには0~9までのいずれか1つの数字が入っています。
Cにはa,b,cのいずれか1つの文字が入っています。
Aの各値に対してBの値が0のレコードは1個だけです。

(例)TABLE1
  A  B  C
  1  0  a
  1  9  b
  1  2  c
  2  1  b
  2  3  a
  2  0  c
  2  7  c
  3  1  a
  3  0  b
   :   :   :
 999  0  a
   :   :   :

このようなテーブル(TABLE1)に対して、
Aの各値毎に、
Bの値が0以外のレコードのCの値を
Bの値が0のレコードのCの値に変更する
SQL式
(ACCESSのクエリデザインのSQLレビューのSELECT;の所に入力する
UPDATE TABLE1 SET C=…;のような式)
を教えてください。

(例) 変更後のTABLE1
  A  B  C
  1  0  a
  1  9  a
  1  2  a
  2  1  c
  2  3  c
  2  0  c
  2  7  c
  3  1  b
  3  0  b
   :   :   :
 999  0  a
   :   :   :

投稿日時 - 2019-10-16 11:31:57

QNo.9667716

困ってます

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

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

投稿日時 - 2019-10-17 21:57:20

お礼

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

投稿日時 - 2019-10-18 09:51:17

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

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

投稿日時 - 2019-10-17 23:51:31

お礼

>こちら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の回答者様の回答でこの問題は解決しましたのでこれでクローズさせていただきます。
いろいろ調べていただきましてありがとうございました。

投稿日時 - 2019-10-18 11:08:15

ANo.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
-------------------------------------------------------

投稿日時 - 2019-10-17 18:41:44

お礼

>繰返しテスト可能なように、元TBを加え

工夫しましたね。こうしておくことによって
毎回、TABL1を元の状態に手直ししなくても済みます。

>これを修正すると、今度は実行時エラーになってしまいます。

こちらでも同じエラーになります。

TABL0を作成しなくても
UPDATEのSQL式の中でできないか考えてみます。

ありがとうございました。

投稿日時 - 2019-10-18 09:19:55

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

投稿日時 - 2019-10-17 03:03:16

お礼

上記のコードですが、TABLE1(=TABL1)の
フィールドAが1で、フィールドBが0でないレコードの
フィールドCの値を同じフィールドCの値に変更しているだけなので、
上記のコードでは、TABLE1は何も変わらないはずです。
実際に実行してみましたがTABLE1は何も変化しませんでした。

そちらでは、このコードを実際に実行してみて
質問の「変更後のTABLE1」のようになったのでしょうか。

よろしくお願いします。

投稿日時 - 2019-10-17 13:57:48

あなたにオススメの質問