在使用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;