如何在BigQuery现有表中最优覆盖更新匹配ID的列值
BigQuery 现有表按ID匹配增量更新方案
最优实现逻辑
使用BigQuery原生的MERGE DML语句实现精准更新,该语句仅对符合匹配条件的行执行操作,无需全表重写,同时支持自定义更新判断条件,完美匹配需求。
可直接使用的示例代码
MERGE `你的项目ID.你的数据集名称.table1` AS t1 USING `你的项目ID.你的数据集名称.table2` AS t2 -- 按ID匹配更新行 ON t1.id = t2.id -- 仅当ID匹配且value值不同时才执行更新,避免无意义写入 WHEN MATCHED AND t1.value != t2.value THEN UPDATE SET value = t2.value
执行效果(对应示例数据)
更新后的table1结果如下:
| name | id | value |
|---|---|---|
| jose | 1 | 200 |
| jack | 5 | 200 |
| lex | 4 | 800 |
- 仅ID为1、4、5的行触发更新,其余行无任何改动
- 若table2中某行id对应的value和table1完全一致,不会触发更新操作,进一步降低写入开销
原方案问题说明
之前写的LEFT JOIN查询如果配合CREATE OR REPLACE TABLE使用,属于全表覆写操作,哪怕仅需要更新几行数据,也会重写整张表的所有数据,资源开销大、性能差,MERGE操作仅修改目标行,开销远低于全表覆写。
可选扩展配置
如果需要将table2中table1不存在的ID数据新增到table1中,可在MERGE语句末尾追加以下逻辑:
WHEN NOT MATCHED BY TARGET THEN INSERT (name, id, value) -- 新增的行name为空,可按业务需求调整赋值逻辑 VALUES (NULL, t2.id, t2.value)
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

