Atsushi2022の日記

データエンジニアリングに関連する記事を投稿してます

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