複数のテーブルを組み合わせたUPDATE文
Oracleテーブル向けの、副問い合わせを用いたちょっと高度なUPDATE構文です。
恥ずかしながら、最近までこの方法を知りませんでした。
調査の仕方が良くなかったのかな…
気付いたきっかけも、検索したわけではなく試したらできたからです。エッヘン。
書き方は
UPDATE テーブル名
SET (列名A, 列名B, 列名C) = (SELECT A, B, C FROM ...)
WHERE...
これだけ。
列A,B,Cの値が、副問い合わせで取得した情報に基づき、上書きされます。
この書き方を知るまでは
UPDATE テーブル名
SET 列名A=(SELECT A FROM ...)
, 列名B=(SELECT B FROM...)
, 列名C=(SELECT C FROM ...)
WHERE...
といった具合に、カラムごとに副問い合わせを記述していました。
場合によっては同じようなSELECT文を複数書く必要があり、ゴチャっとします。
今回、メインテーブルの各カラムの値に、
サブテーブル(メインと同じキーをもつ)の数値を加算する
という必要が出てきて悩んでいました。加算値は一回だけ取ればいいので、先に取ってきてパラメータとして渡してやるか…と思っていたのですが、以下の表記で解決。
UPDATE MAIN_TABLE
SET ( 列名A, 列名B, 列名C)
=(SELECT MAIN_TABLE.列名A + SUB_TABLE.加算値
, MAIN_TABLE.列名B + SUB_TABLE.加算値
, MAIN_TABLE.列名C + SUB_TABLE.加算値
FROM SUB_TABLE
WHERE MAIN_TABLE.KEY = SUB_TABLE.KEY )
知らなかったのは、自分だけ?知らなかったという方、ご活用ください。
副問い合わせの結果は、一意に返ってくるようにしないとエラーになるのでご注意を。