アウトプットができる技術者に

it's a time to take a new step !

Sybase ASE 入門 merge

merge statement では Table a のデータを Table b に マージできます。
BatchJobなどで work table の データを 本番用 Tableにコミットする場合に便利?

不安定なので個人的にはあまり推奨できない。
普通にupdate,insertしても結果はほぼ同じなので。

Sample

  • m1 テーブルに m1_wテーブルを マージする
merge
        into m1 t
        using m1_w w
        on t.id = w.id
          when matched
                then update set name = w.name, age = w.age
          when not matched
                then insert (id,name,age) values (w.id,w.name,w.age)

update,insertでの書き換え

update m1 set t.name = w.name 
from m1 t, m1_w w
where t.id = w.id

insert into m1 (id) 
select id from m1_w w 
where not exists (select 1 from m1 t where t.id = w.id)
Notice
  • なぜか Autosysから 実行すると、成功したり失敗したり不安定に。
  • マージ元のテーブルが マージ先のテーブルのユニーク制約に違反してると、重複キー制約で失敗する
  • クラスタード Index を含むテーブルをターゲットにすると duplicate エラーが発生する バグがある (どのversionか未確認)