ORACLE MERGE INTO语句报错,unable to get a stable set of rows in the source tables

在使用merge into语句,用一张表的数据tab2更新另一张表tab1时,如果tab1中用来匹配的字段一条在tab2中有多条对应的数据,就会报错:

ORA-30926: unable to get a stable set of rows in the source tables

merge into的使用语法

merge into tab1  
using tab2  
on(tab1.id=tab2.id)  
when matched then  
update set tab1.val = tab2.val

解决方法

可以用partition by函数对tab2中的多条字段进行排序,只取第一条来更新tab1。
举个例子,通过学生信息表stu_info来更新学生表student里的学生班级信息。同一个学生对应了不同的班级,使用partition by按创建时间排序,可以得到该学生最新的班级情况。

merge into student a 
using ( 
  select stu_id, class from 
(select t1.*,row_number() over (partition by stu_id order by create_date desc) rn from stu_info t1) t2
where rn=1) b
on (a.stu_id= b.stu_id)
  when matched then update 
 set a.class = b.class;

你可能感兴趣的:(oracle,数据库)