MaxCompute SQL支持在一个语句中将数据插入不同的目标表或者分区中实现多路输出。

命令格式
FROM from_statement
INSERT OVERWRITE | INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)]
select_statement1 [FROM from_statement]
[INSERT OVERWRITE | INTO TABLE tablename2 [PARTITION (partcol1=val3, partcol2=val4 ...)]
select_statement2 [FROM from_statement]]

功能说明

将数据插入不同的目标表或者分区中实现多路输出。
说明
  • 通常,单个SQL中最多可以写128路输出。超过128路,则报语法错误。
  • 在一个multi insert中:
    • 对于分区表,同一个目标分区不允许出现多次。
    • 对于未分区表,该表不能出现多次。
  • 对于同一张分区表的不同分区,不能同时有insert overwriteinsert into操作,否则报错返回。
参数说明
  • from_statement:FROM子句,代表数据来源。例如,源表名称。
  • PARTITION (partcol1=val1, partcol2=val2 ...):需要插入数据的分区名称,此参数不允许使用函数等表达式,只能是常量。
  • tablename1,tablename2:需要插入数据的目标表名称。
  • select_statement:SELECT子句,从源表中查询需要插入的数据。
示例
  • 将表sale_detail的数据插入到sale_detail_multi里的2010年及2011年中国大区的销售记录中。
    --创建表sale_detail_multi。
    create table sale_detail_multi like sale_detail;
    
    --将表sale_detail中的数据插入到表sale_detail_multi。
    set odps.sql.allow.fullscan=true; //开启全表扫描,仅此session有效。
    from sale_detail
    insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' ) 
    select shop_name, customer_id, total_price 
    insert overwrite table sale_detail_multi partition (sale_date='2011', region='china' )
    select shop_name, customer_id, total_price ;
  • 如果同一分区出现多次,如下语句,则报错返回。
    from sale_detail
    insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' )
    select shop_name, customer_id, total_price
    insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' )
    select shop_name, customer_id, total_price;
  • 如果同一张表的不同分区,同时有insert overwrite和insert into操作,如下语句,则报错返回。
    from sale_detail
    insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' )
    select shop_name, customer_id, total_price
    insert into table sale_detail_multi partition (sale_date='2011', region='china' )
    select shop_name, customer_id, total_price;