【DB2】Merge文を利用した高速データ抽出【データベース備忘録】

こんにちは、エンジニアの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でも役に立つと思うので、参考にしていただければと思います。

コメント

タイトルとURLをコピーしました