以下の様なテーブルがあったとして、
|ID1|ID2|フラグ| |
| 1| 1| false| |
| 1| 2| false| |
| 1| 3| false| |
| 1| 4| false|ここ|
| 2| 1| false| |
| 2| 2| false|ここ|
| 3| 1| false|ここ|
| 4| 1| false| |
| :| :| :| |
の「←ここ」と書いた部分(同ID1内で、ID2最大のレコードについて)のフラグをtrueに更新するクエリを書きたいです。
「←ここ」と書いたレコードのみを取り出す選択クエリは容易に得られるのですが、元テーブルに対してjoin結合しても、where句に選択クエリのフィールドを与えても、いずれでも「更新可能なクエリであることが必要です。」と言われてしまいます。
「ADOなどでぐるぐる」ではなく、更新クエリでスパッと解決できると助かります。
(表組み記法がうまく使えてないかもしれません。見にくかったら申し訳ありません)
Accesssに特化した方法となりますが、下記で確認してます
UPDATE テーブル SET テーブル.フラグ = true WHERE DCOUNT("*", "テーブル", "ID1=" & ID1 & " AND ID2>" & ID2) = 0
DCOUNTの第三引数(WHERE句)は下記のような式として実行されます
ID1 | ID2 | 式 | DCOUNTの結果 |
---|---|---|---|
1 | 1 | ID1=1 & AND ID2>1 | 3 |
1 | 2 | ID1=1 & AND ID2>2 | 2 |
1 | 3 | ID1=1 & AND ID2>3 | 1 |
1 | 4 | ID1=1 & AND ID2>4 | 0 |
2 | 1 | ID1=2 & AND ID2>1 | 1 |
2 | 2 | ID1=2 & AND ID2>2 | 0 |
3 | 1 | ID1=3 & AND ID2>1 | 0 |
4 | 1 | ID1=4 & AND ID2>1 | 0 |
仮にID1とID2が数値ではなく文字列であった場合は下記の様にします
UPDATE テーブル SET テーブル.フラグ = true WHERE DCOUNT("*", "テーブル", "ID1=""" & ID1 & """ AND ID2>""" & ID2 & """") = 0
式は
|*ID1="1" AND ID2>"1"|
と展開されます
ありがとうございました。求めていた動作が得られました。
迅速かつ丁寧、動作原理までわかりやすいご回答、誠にありがとうございました。