久しぶりに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は、AS400のDB2(DB2 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つのサイクルに気づけたので、もう大満足ですね!