SQLのUpdate文に関する質問です。

複数のテーブルの値を加減算して、特定テーブルの値を更新するSQLは、以下のテーブル例ではどのように記述すれば良いでしょうか?

(例)
・テーブルA
 キー
 集計項目A

・テーブルB
 キー
 集計項目B

・テーブルC
 キー
 集計項目C

・結果テーブルD
 キー
 結果項目D

結果テーブルDとキーが一致するレコードについて、
 (集計項目A)+(集計項目B)-(集計項目C)
の計算結果を結果項目Dへ代入したいのです。

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

ベストアンサー

id:windofjuly No.1

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

ポイント100pt

ベースとしては次のようなものでいいと思うけど、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によって何を選んだほうがいいかということになる

id:darkhair_tachikawa

ご指摘、ご回答ありがとうございます。

共通のSQL命令で対応できるかな?と安直に考えていましたが、実行計画を考慮したり色々な書き方を調べたりするならRDBMSを明示しておくべきでしたね。

使用しているのはOracle 10gです。この他にもうまい使い方があればご回答お願いします。

2010/07/16 01:06:10

コメントはまだありません

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

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

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

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