问题:
已知两张表TA、TB,这两张表的表结构完全相同。现在有这样的要求,TA是根据要求按一定频率抽取的数据,TB是保存发生变化的表。每次抽取TA表,都会比较TA、TB表,看这两个表中是否存在完全一样的数据项值。
例子:
TA、TB的主键是CA1,则使用TA和TB表中的其他字段值比较(on TA.CA1=TB.CA1).eg
Merge TB
using TA
on (TA.CA1=TB.CA1)
when matched then
...(比较其他字段是否相同,存在不同的记录更新记录)
when not matched then
...(插入新的记录)
分析:
当比较其他字段是否相同时,存在这样的几种情况:
TA.CA2 TB.CA2 操作
null null 不执行
'a' null A覆盖B
null 'a' 不执行
'a' 'a' 不执行
'b' 'a' A覆盖B
解答:
对于这种情况
我们可以使用两个函数结合来操作
update set
TA.ca2 = TB.ca2,
TA.ca3 = TB.ca3,
TA.ca4 = TB.ca4,
TA.ca5 = TB.ca5
when
nvl2(TA.ca2,decode(TA.ca2,TB.ca2,0,1),0)+
nvl2(TA.ca3,decode(TA.ca3,TB.ca3,0,1),0)+
nvl2(TA.ca4,decode(TA.ca4,TB.ca4,0,1),0)+
nvl2(TA.ca5,decode(TA.ca5,TB.ca5,0,1),0)
>0;
这里,如果存在任何一个字段不相同,则when处的nvl2就返回1,其结果是大于0的,当所有的值都相同或TA.caX是空时才为0.
这种思想非常好。