欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

03-100 merge into ORA-30926: 无法在源表中获得一组稳定的行

程序员文章站 2022-05-24 20:50:15
...

merge into使用

MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)
WHEN MATCHED THEN
	[UPDATE sql]
WHEN NOT MATCHED THEN
	[INSERT sql]
merge into ams_asset_info t1
using ams_asset_info_diff_domain t2
on (t1.assetno=t2.assetno)
when matched then
  update set t1.domain=t2.domain;
  commit;

使用merge into是为了根据匹配条件on(condition)利用table_source 的数据更新合并table_target的数据。
merge into的内部处理是将table_source的每一条记录和table_target的每一条记录对比匹配,匹配到符合条件的记录就会进行修改,匹配不到的话就会insert。如果table_source的匹配列中有重复值的话,等到第二次重复的列值匹配的时候,就会将第一次的update后的值再一次update,就是说合并后的table_target中会丢失在table_source中的记录!!!如果记录丢失的话,两表合并的意义何在?因此我们使用merge into要注意:源表匹配列中不能有重复值,否则无法匹配报错。

merge into dhmp_ams.ams_asset_info t1
using

 (select *
    from (select mac,
                 remark2,
                 row_number() over(partition by mac order by mac) rank
            from rms.itms_order_info
           where mac is not null
             and product_type in (1, 7)
             and remark2 is not null)
   where rank = 1) t2

on (t1.ottmac = t2.mac)
when matched then
  update set t1.contactinfo = t2.remark2
相关标签: merge into