更新时间:2025-07-10 GMT+08:00
        
          
          
        
      
      
      
      
      
      
      
      
  
      
      
      
        
MERGE INTO
功能描述
通过MERGE INTO语句,将目标表和源表中数据针对关联条件进行匹配,若关联条件匹配时对目标表进行UPDATE,无法匹配时对目标表执行INSERT。此语法可以很方便地用来合并执行UPDATE和INSERT,避免多次执行。
 
    - 如需使用实时数仓能力,请在DWS控制台创建集群时,选择存算一体1:4云盘规格,了解更多参见存算一体规格。
 - 创建DWS集群选择1:8云盘规格为标准数仓,1:4云盘规格为实时数仓,以下内容描述的“实时数仓”、“标准数仓”即通过以上规格区分。
 
注意事项
对于并发MERGE INTO场景,触发UPDATE时,传统列存储格式由于同时操作相同CU时会产生锁冲突所以并发性能较差,对于HStore表由于不需要阻塞等待,并发MERGE INTO性能可达到列存的百倍以上。
语法格式
         1 2 3 4 5 6 7 8 9 10 11 12 13 14  | 
        
         MERGE INTO table_name [ [ AS ] alias ] USING { { table_name | view_name } | subquery } [ [ AS ] alias ] ON ( condition ) [ WHEN MATCHED THEN UPDATE SET { column_name = { expression | DEFAULT } | ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] [ WHERE condition ] ] [ WHEN NOT MATCHED THEN INSERT { DEFAULT VALUES | [ ( column_name [, ...] ) ] VALUES ( { expression | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } ];  | 
       
参数说明
- INTO子句
     
指定正在更新或插入的目标表。
- table_name
       
目标表的表名。
 - alias
       
目标表的别名。
取值范围:字符串,符合标识符命名规范。
 
 - table_name
       
 - USING子句
     
指定源表,源表可以为表、视图或子查询。
 - ON子句
     
关联条件,用于指定目标表和源表的关联条件。不支持更新关联条件中的字段。ON关联条件可以是ctid, xc_node_id, tableoid这三个系统列。
 - WHEN MATCHED子句
     
当源表和目标表中数据针对关联条件可以匹配上时,选择WHEN MATCHED子句进行UPDATE操作。
 
      不支持更新分布列、系统表以及系统列。
 - WHEN NOT MATCHED子句
     
当源表和目标表中数据针对关联条件无法匹配时,选择WHEN NOT MATCHED子句进行INSERT操作。
 
      - 不支持INSERT子句中包含多个VALUES。
 - WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省。
 - 不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。
 
 
示例
    创建进行MERGE INTO的目标: 
    
     
      
       
        
     
    
   
   
          1 2  | 
         
          CREATE TABLE target(a int, b int)WITH(ORIENTATION = COLUMN, ENABLE_HSTORE = ON); INSERT INTO target VALUES(1, 1),(2, 2);  | 
        
    创建数据源表: 
    
     
      
       
        
     
    
   
   
          1 2  | 
         
          CREATE TABLE source(a int, b int)WITH(ORIENTATION = COLUMN, ENABLE_HSTORE = ON); INSERT INTO source VALUES(1, 1),(2, 2),(3, 3),(4, 4),(5, 5);  | 
        
    执行MERGE INTO操作: 
    
     
      
       
        
     
    
   
  
          1 2 3 4 5 6 7  | 
         
          MERGE INTO target t USING source s ON (t.a = s.a) WHEN MATCHED THEN UPDATE SET t.b = t.b + 1 WHEN NOT MATCHED THEN INSERT VALUES (s.a, s.b) WHERE s.b % 2 = 0;  |