【Snowflake】Snowflake ~ MERGE INTO ~

■ はじめに

Snowflake の Merge Into について扱う。

目次

【1】Merge Into
【2】構文
【3】使用上の注意
【4】サンプル
 例1:Hello world
 例2:INSERT OR UPDATE

【1】Merge Into

* 2番目のテーブルまたはサブクエリの値に基づいて、
 テーブルの値を挿入、更新、削除

https://docs.snowflake.com/ja/sql-reference/sql/merge.html

 => INSERT or UPDATE もこれで可能

【2】構文

MERGE INTO <target_table>
  USING <source>
  ON <join_expr> -- Tableだけでなくサブクエリも指定可能
  WHEN MATCHED [ AND <case_predicate> ] THEN
    UPDATE SET <col_name> = <expr> [ , <col_name2> = <expr2> ...
  WHEN NOT MATCHED [ AND <case_predicate> ] THEN
    INSERT [ ( <col_name> [ , ... ] ) ] VALUES ( <expr> [ , ... ] )

【3】使用上の注意

* 以下の関連記事を参照のこと

Snowflake ~ Mergeの使用上の注意 ~
https://dk521123.hatenablog.com/entry/2023/09/05/161817

【3】サンプル

例1:Hello world

-- マージしたいテーブル「target_table」
MERGE INTO target_table t
  -- 結合するテーブル「source_table」を指定
  USING source_table s
  -- 結合条件「t.id = s.id」を指定
  ON t.id = s.id
  -- ★1:値が一致した場合(Update/Delete用)
  WHEN MATCHED THEN
    -- 値が一致した場合のアクションを指定
    UPDATE
      SET
        t.delete_flag = 0
  -- ★2:値が一致しない場合(Insert用)
  WHEN NOT MATCHED THEN
    -- 値が一致しなかった場合のアクションを指定
    INSERT
      (
        id,
        name,
        delete_flag
      )
    VALUES
      (
        s.id,
        s.name,
        s.delete_flag
      );

例2:INSERT OR UPDATE

-- USING の部分を以下のような SELECT にすることも可能
MERGE INTO target_table AS t
USING (SELECT 'x001' AS id, 'Mike' AS name, false AS delete_flag) AS s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET s.name = t.name,  s.delete_flag = t.delete_flag
WHEN NOT MATCHED THEN INSERT (id, name, delete_flag) VALUES (s.id, s.name, s.delete_flag);

参考文献

https://dev.classmethod.jp/articles/snowflake-stream-try/
https://qiita.com/Intel0tw5727/items/1ab1cb144564d3b516bf

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ Mergeの使用上の注意 ~
https://dk521123.hatenablog.com/entry/2023/09/05/161817