BigQueryでのDELETE-INSERTは、MERGE ~ ON FALSEで行う
BigQueryでDELETE-INSERTしたい場合、
MERGE ~ ON FALSE
WHEN NOT MATCHED BY SOURCE THEN DELETE
WHEN NOT MATCHED BY TARGET THEN INSERT ROW
を使用すると良い。DELETE-INSERTを行えるうえ、動作も早いらしい。
ON FALSEとすることで、NOT MATCHED BY SOURCE/TARGETの両方の条件が実行される。
注意しなければいけないのが、WHEN NOT MATCHED BY SOURCE THEN DELETEが抜けていると、DELETEされずにどんどんデータが追加されて冪等な処理にならない。
例)
MERGE INTO test_dataset.target
USING (
SELECT *
FROM test_dataset.original AS o
)
ON FALSE
WHEN NOT MATCHED BY SOURCE THEN DELETE
WHEN NOT MATCHED BY TARGET THEN INSERT ROW
参考
https://levelup.gitconnected.com/powerful-feature-on-merge-statement-in-bigquery-i-e9c805b9bc9a