ここから本文です

Access2013で以下の更新SQLを書きたいのですが、どう書けばよいのかまったくわかり...

hal********さん

2019/11/2700:04:16

Access2013で以下の更新SQLを書きたいのですが、どう書けばよいのかまったくわかりません。やりたいことは以下の通りですが、実現可能でしょうか。
どのように書けば実現できるか教えてください。

■やりたいこと
Field1が最新の日付のレコードのField3を更新する。
更新内容は、Field2=Field2のレコードのうちField1が最新の日付の次に大きいレコードのField3をField1が最新の日付のレコードのField3に編集する。
分かりづらいですが、以下の2019/11/27,AAAのレコードのField3に2019/11/25,AAAのレコードのField3を編集したいです。

■更新前テーブル
Table名:Test
Field1(主キー),Field2(主キー),Field3
2019/11/24,AAA,zzz
2019/11/25,AAA,xxx
2019/11/26,BBB,yyy
2019/11/27,AAA,Null
2019/11/27,CCC,Null

■更新後テーブル
2019/11/24,AAA,zzz
2019/11/25,AAA,xxx
2019/11/26,BBB,yyy
2019/11/27,AAA,xxx ← ここが更新される
2019/11/27,CCC,Null

閲覧数:
44
回答数:
3
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

m3_maki0さん

2019/12/103:34:05

目がちらつくので、SQLビューのままで整形していません。
余計な括弧とか見苦しいですがご勘弁を。

UPDATE Test SET Test.Field3 = DLookUp("Field3","Test","Field1 = #" & DMax("Field1","Test","Field2='" & [Field2] & "' AND Field1 < #" & [Field1] & "#") & "# AND Field2='" & [Field2] & "' ")
WHERE (((Test.Field1)=DMax("Field1","Test","Field2='" & [Field2] & "' ")) AND ((Test.Field3) Is Null) AND ((DMax("Field1","Test","Field2='" & [Field2] & "' AND Field1 < #" & [Field1] & "#")) Is Not Null));

  • m3_maki0さん

    2019/12/105:23:15

    この方がいいかな。

    UPDATE Test SET Test.Field3 = DLookUp("Field3","Test","Field1 = #" & DMax("Field1","Test","Field2='" & [Field2] & "' AND Field1 < #" & [Field1] & "#") & "# AND Field2='" & [Field2] & "' ")
    WHERE (((Test.Field3) Is Null) AND ((Test.Field1)=DMax("Field1","Test","Field2='" & [Field2] & "' ")) AND ((DCount("Field2","Test","Field2='" & [Field2] & "'"))>1));

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/12/3 23:16:47

ありがとうございます。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

ony********さん

2019/11/2717:04:27

SQLは苦手ですが、下記の3ステップを踏めば、できます。

①Field3がNull以外で、Field2のグループ化、Field1の最大を別のテーブル1に入れる。

別のテーブル1
Field1............Field2
2019/11/25....AAA
2019-11/26....BBB

②Testテーブルと別のテーブル1をField1とField2の2項目で結合し、Field2とField3をさらに別のテーブル2に入れる。

別のテーブル2
Field2....Field3
AAA........xxx
BBB........yyy

③Testテーブルと別のテーブルをField2で結合し、TestテーブルのFiled3がNullの場合、別のテーブル2のField3をセットする。

Test
Field1............Field2.........Filed3
2019/11/24.....AAA...........zzz
2019/11/25.....AAA...........xxx
2019/11/26.....BBB...........yyy
2019/11/27.....AAA...........xxx
2019/11/27.....CCC...........Null

hdu********さん

2019/11/2710:22:46

うーん、この案件はSQL一発で更新はAccessのデータベース(mdb、Accdb)では難しいでしょうねぇ。
RecordsetやDynasetを活用して処理した方が手っ取り早いし、間違いないでしょう。

要は、各Field2のグループの最新レコードのField3は一つ前のレコードのそれを引き継ぐという事ですよね。

だったら、最新日付を持つデータを取得。これはSQL一発でもDMAX関数で最新日付取ってSQL書いてもどちらも同じ位のスピードでしょう。
で、これをループで回して、DMAX関数でField2毎に次に大きな日付をとって、その値を更新。該当レコードが無ければスキップ。
みたいな処理になると思います。


ま、一発じゃ無理です。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる