■ はじめに
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