功能
MaxCompute支持了delete
、update
功能,但当您需要使用多个insert
、update
、delete
对目标表进行批量操作时,需要编写多条SQL语句,然后进行多次全表扫描才能完成操作。MaxCompute提供的merge into
功能,只需要进行一次全表扫描操作,就可以完成全部操作,执行效率要高于insert
+update
+delete
。
merge into
操作具备原子性,作业中的insert
、update
、delete
操作都执行成功时,作业才算执行成功;任一内部逻辑处理失败,则整体作业执行失败。
同时,merge into
可以为您避免分别执行insert
、update
、delete
操作时,可能导致部分操作执行成功,部分操作执行失败,其中成功部分无法回退的问题。
使用限制
merge into
功能的使用限制如下:
- 仅支持Transactional表。更多创建Transactional表信息,请参见表操作。
- 不允许在同一条
merge into
语句中对相同的行执行多次insert
或update
操作。
查看是否是Transactional表
>desc extended t1;
sql语句
格式
merge into <target_table> as <alias_name_t> using <source expression|table_name> as <alias_name_s>
--从on开始对源表和目标表的数据进行关联判断。
on <boolean expression1>
--when matched…then指定on的结果为True的行为。多个when matched…then之间的数据无交集。
when matched [and <boolean expression2>] then update set <set_clause_list>
when matched [and <boolean expression3>] then delete
--when not matched…then指定on的结果为False的行为。
when not matched [and <boolean expression4>] then insert values <value_list>
实例
MERGE INTO xgj.classes_out AS t1 USING
(SELECT cls_id,name FROM (
SELECT *,ROW_NUMBER() OVER(PARTITION BY cls_id ORDER BY name DESC) AS rownum
FROM xgj.locations_deal
WHERE ds = '${bizdate}'
)
WHERE rownum = 1) AS t2
ON t1.cid =t2.cls_id AND t1.ds ='${bizdate}'
WHEN matched THEN UPDATE SET t1.school_name = t2.name;
其他数据库支持merge into 应该都是可以这样去更新的