タイガー!タイガー!じれったいぞー!(SE編)

AS400, Java, JavaEE, JSF等の開発、習慣など。日々の気づきをまとめたブログ(備忘録)

【SQL】UPDATE命令で項目をまとめて更新する

久しぶりにSQLネタです。

SQLは「基本的なことができればOK!」と思っています。

その理由は、SQLを極めれば何でもできてしまうので、気を抜くと確実に「スパゲティSQL」を増殖してしまう恐れがあるから。

しかしながら、時々「こんなことができないかなぁ~?」と思うことがあります。

その日が今日でした!

次のようなSQL文を書く場面がありました。

update TIGERDB.TABLE1 AS T1
   set T1.FIELD1 = (select T2.FIELD1 TIGERDB.TABLE2 AS T2 
                     where T2.KEY1 = T1.FIELD9),
       T1.FIELD2 = (select T2.FIELD2 TIGERDB.TABLE2 AS T2 
                     where T2.KEY1 = T1.FIELD9),
       T1.FIELD3 = (select T2.FIELD3 TIGERDB.TABLE2 AS T2 
                     where T2.KEY1 = T1.FIELD9)
       T1.UPDATE_TS = CURRENT TIMESTAMP 
 where T1.KEY1 = 'XXXXXX'
;

明らかに、TABLE2を無駄に読んでいることがわかります。

INSERT文のVALUESのように、複数の項目をまとめて格納できないか?と思い、まずはトライしてみました。

RDBは、AS400DB2DB2 for IBM i - V7R3M0)になります。

コードを下記のように書き直して、実行!

update TIGERDB.TABLE1 AS T1
   set (T1.FIELD1, T1.FIELD2, T1.FIELD3) 
       = (select T2.FIELD1, T2.FIELD2, T2.FIELD3 TIGERDB.TABLE2 AS T2 
            where T2.KEY1 = T1.FIELD9),
       T1.UPDATE_TS = CURRENT TIMESTAMP 
 where T1.KEY1 = 'XXXXXX'
;

結果は???

TIGERDB の TABLE1  の 1 行が更新された。

オッケーでございまーす!

めでたく、UPDATE命令で項目をまとめて更新することができました。

中身もBefore, Afterで確認しましたが、まったく問題無しでした。

こうした小技を知っていると知っていないとで、作業にかける時間が変わってきますよね。

いい勉強になりました。

まさに、次の4つのサイクルだと思います。

「できないか?」→「調べる」→「試す」→「武器にする」

UPDATEのSET命令という地味な話ではありましたが、スキルアップのための4つのサイクルに気づけたので、もう大満足ですね!