merge into 的用法如下:
merge into t_AAA a
using (select t.id, t.time from t_BBB t) b
on (a.id=b.id)
when matched then
update set a.last_time=b.time where b.time>a.last_time
when not matched then
insert (id, last_time)
values(b.id, b.time);
其中:id列在表t_AAA中具有唯一约束
这里要说的是这种情况:
当select t.id, t.time from t_BBB t在id列上有重复值时,例如结果集如下
id time
123 2008-1-18 15:26
345 2008-1-18 12:26
123 2008-1-18 16:26
时,上述的merge into 语句将出现违反唯一约束的错误。
解决的办法有两个:
第一,将select t.id, t.time from t_BBB t结果集用游标来循环,每次循环merge一次。
第二,将结果集里面在id列上重复的记录去掉,可以用下面的办法:
select id, time from
(select t.id, t.time, row_number() over (partition by t.id order by t.time) rn
from t_BBB t)
where rn=1
这样就可以保证不出现违反唯一约束的情况。当然,上面的两个办法里面都需要考虑null会不会导致id列上的产生重复记录。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12513946/viewspace-151855/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12513946/viewspace-151855/