Accessの更新クエリに関する質問です。

以下の様なテーブルがあったとして、
|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などでぐるぐる」ではなく、更新クエリでスパッと解決できると助かります。
(表組み記法がうまく使えてないかもしれません。見にくかったら申し訳ありません)

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/08/25 21:22:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント100pt

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

と展開されます

id:oich

ありがとうございました。求めていた動作が得られました。

迅速かつ丁寧、動作原理までわかりやすいご回答、誠にありがとうございました。

2010/08/25 21:21:43
  • id:windofjuly
    うぃんど 2010/08/25 21:29:08
    【1】ID1="1" AND ID2>"1"
    はてな記法を失敗しました
    先頭の |* と末尾の |を無視してください
     
    【2】DCOUNT以外にもDLOOKUPなども使えます
    UPDATE テーブル AS t1 SET テーブル.フラグ = true
    WHERE DLOOKUP("フラグ","テーブル","ID1=" & ID1 & " AND ID2>" & ID2) Is Null;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません