AccessでUPDATEの更新値でサブクエリを使えない DMaxを使えばエラーにはならない
えーと本日はAccessでのサブクエリの話題である。
先日、Accessで他のテーブルにある値で更新かけたいんだけど、と言った質問を受けた。
何も考えずに、サブクエリ使えば良いのでは?
と答えたのだが、サブクエリを使うと「更新可能なクエリであることが必要です」のエラーになるというではないか。
えーそうなの?と思いSQLポケットリファレンス を見てみると...
UPDATE命令のサブクエリを使って更新のところをみると...
UPDATE foo SET a = (SELECT MAX(b) FROM bar) WHERE c = 1
*上記の例はAccessでは実行できません。
*上記の例はAccessでは実行できません。
の注意書きが...
自分で書いておいて忘れていた。
じゃあ、結合して参照すれば?
と手のひら返しで答えたのではあるが、AccessってUPDATEでFROM句書けたっけか?
AccessではUPDATEにFROM句は書けないが、INNER JOINできる。
UPDATE foo INNER JOIN bar ON foo.a = bar.a SET foo.a = bar.b WHERE c = 1
みたいに書けば良いらしい。ふーん。SQLポケリには書いてないなぁ。しまった。
でも単純に結合したテーブルの列を参照して更新するわけにはいかないようで、この作戦も失敗。
どうも結合すると複数行のデータが出てきてしまい、サブクエリでMAXを使わないといけないらしい。
どうしたものかとネットを検索しているとDMaxなら使えるような記事を発見。
そうか、DMaxなら使えるのか。前に記事を書いたかも。
DSumやらDMaxは、定義域集合関数っていう関数でサブクエリみたいな集合関数である。Access独自の関数である。詳しくは上の関連記事を参照して欲しい。
以下のクエリはAccessではエラーになるが
UPDATE foo SET a = (SELECT MAX(b) FROM bar) WHERE c = 1
以下のクエリなら実行可能。
UPDATE foo SET a = DMAX("b", "bar") WHERE c = 1
結論としては
AccessでUPDATEでサブクエリは使えないが、定義域集合関数なら使えるっていうこと。
本日は以上

Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本
![DSC_1228[1].jpg](https://asai-atsushi.up.seesaa.net/_imagesblog_f55asai-atsushi/DSC_12285B15D.jpg)
投稿者プロフィール

-
システムエンジニア
喋れる言語:日本語、C言語、SQL、JavaScript