複数のテーブルの値を加減算して、特定テーブルの値を更新するSQLは、以下のテーブル例ではどのように記述すれば良いでしょうか?
(例)
・テーブルA
キー
集計項目A
・テーブルB
キー
集計項目B
・テーブルC
キー
集計項目C
・結果テーブルD
キー
結果項目D
結果テーブルDとキーが一致するレコードについて、
(集計項目A)+(集計項目B)-(集計項目C)
の計算結果を結果項目Dへ代入したいのです。
ベースとしては次のようなものでいいと思うけど、RDBMSによって文法が微妙に違うし、サブクエリをうまく使えないものもあるし、
Accessなどは他のRDBMSと違ってLEFT JOINによる結合が使えたりもする
同じRDBMSでもいくつかの書き方が可能だったりして、それぞれのテーブルのレコード数によって組み方を替える時もあったりするので、
本当に知りたければ、使ってるRDBMSの名前とバージョンは明確にしたほうがいいと思う
UPDATE 結果テーブルD SET 結果項目D = (SELECT sum(集計項目A) FROM テーブルA WHERE テーブルA.キー = 結果テーブルD.キー) + (SELECT sum(集計項目B) FROM テーブルB WHERE テーブルB.キー = 結果テーブルD.キー) - (SELECT sum(集計項目C) FROM テーブルC WHERE テーブルC.キー = 結果テーブルD.キー)
該当する項目が1対1であったとしてもSQLを解析して実行計画を立てるプランナという処理部分にはわからなかったりするので「返されるレコード数は1件だけだよ」という意味でsumを使っている。別解としてLIMITを使う方法などもあるけど、このあたりもRDBMSによって何を選んだほうがいいかということになる
ご指摘、ご回答ありがとうございます。
共通のSQL命令で対応できるかな?と安直に考えていましたが、実行計画を考慮したり色々な書き方を調べたりするならRDBMSを明示しておくべきでしたね。
使用しているのはOracle 10gです。この他にもうまい使い方があればご回答お願いします。