BigQuery MERGE Statement
食わず嫌いがすぎるけど覚えたほうがいいので
code:merge.sql
MERGE INTO target
USING ( source )
ON merge_condition
when_clause
target と source を merge_condition で JOIN して when_clause を評価した結果で target を更新する
最低1つ要る
WHEN MATCHED
source と target 両方の行があったとき
UPDATE か DELETE
WHEN NOT MATCHED
WHEN NOT MATCHED BY TARGET
source にあって target にないとき
INSERT のみ
BY ~ を省略したらこちらの意
WHEN NOT MATCHED BY SOURCE
target にあって source にないとき
UPDATE か DELETE
まるごと新しいものに置き換える
code:merge_replace.sql
MERGE INTO table
USING (
SELECT ...
)
ON FALSE
WHEN NOT MATCHED BY SOURCE THEN DELETE
WHEN NOT MATCHED BY TARGET THEN INSERT ROW
ON FALSE で JOIN する (これ matched by source 動くことある?)
宛先テーブル & WRITE_TRUNCATE だとカラムの description が吹っ飛んでしまうので
パーティション分割テーブルに MERGE ステートメントを実行するときに、サブクエリ フィルタ、search_condition フィルタ、または merge_condition フィルタのいずれかでパーティショニング列を使用すると、スキャンされるパーティションを制限できます。ソーステーブル、ターゲット テーブル、またはその両方をスキャンするときに、プルーニングが発生することがあります。