こんにちは、エンジニアのnecomimiです。
今回は私が業務で実装したMerge文によるデータ抽出についてご紹介します。DB2は正直古いRDBMSなので、あまり参考にはならないかと思いますが、もしDB2を業務で利用しているという方がいればぜひ見ていっていただければと思います。
1.Merge文の基本文法
最初にDB2におけるMerge文の基本文法についてご紹介いたします。といっても文法自体は他のRDBMSとほとんど変わりません。
MERGE INTO <テーブル名(マージ先)>
USING <テーブル名(マージ元)>
ON <条件>
WHEN MATCHED THEN
条件が一致した際の処理
WHEN NOT MATCHED THEN
条件が一致しなかった際の処理
;
ここで注意しなければならないのが、THENの後の処理にはUPDATEかINSERTしか行うことができないことです。当然といえば当然ですが、私は最初ここにselect文を入れようとしてしまってました(後から考えれば何やってんだと思います笑)
2.Mergeによるデータ抽出
ここからは実際にMergeを使用してデータ抽出を行っていきます。
例として以下のテーブルを題材として扱います。
TABLE1
ID1 ID2 NAME AGE
------- ------- ------- -------
AAA 10 山田 18
AAA 20 佐藤 26
BBB 10 田中 14
BBB 20 佐藤 15
CCC 10 杉浦 25
CCC 20 島村 22
DDD 10 阿部 34
DDD 20 坂上 13
そして、条件としてID1とID2が以下の通りである場合を考えます。ここではtable2に値をIMPORTしています。
(CSVファイルとして条件が与えられるとします)
(今回の例ではIDの種類が少ないため、where文での抽出も可能ですが、IDの種類が膨大な場合にはCSVを入力として抽出する必要があります)
TABLE2
ID1 ID2 NAME AGE
------- ------- ------- -------
AAA 10 NULL NULL
AAA 20 NULL NULL
BBB 10 NULL NULL
CCC 10 NULL NULL
CCC 20 NULL NULL
後はtable2にtable1をマージするだけです。
MERGE INTO TABLE2
USING TABLE1
ON TABLE2.ID1 = TABLE1.ID1
AND TABLE2.ID2 = TABLE1.ID2
WHEN MATCHED THEN
UPDATE SET
TABLE2.NAME = TABLE1.NAME,
TABLE2.AGE = TABLE1.AGE
WHEN NOT MATCHED THEN
;
結果は以下の通りになります。
TABLE2
ID1 ID2 NAME AGE
------- ------- ------- -------
AAA 10 山田 18
AAA 20 佐藤 26
BBB 10 田中 14
CCC 10 杉浦 25
CCC 20 島村 22
この方法であればcsvをfor文で回すよりも格段に処理速度を向上させることができます。
3.最後に
今回はDB2におけるMerge文でのデータ抽出を扱いました。DB2はもうほとんど使われてないかと思いますが、考え方自体は他のRDBMSでも役に立つと思うので、参考にしていただければと思います。
コメント