我有两个合并语句,其中一个使用其他行的子集。有没有办法优化解决方案。
merge into tableA using (select c from tableB where tableA.a=tableB.a)
on (tableA.a = tableB.a and tableA.b= tableB.b)
when matched update set tableA.c = tableB.c;
merge into tableA using (select c from tableB where tableA.a=tableB.a and
b='10') on (tableA.a = tableB.a)
when matched update set tableA.c= tableB.c where tableA.c is null;
例如,
表A
a b c
100 10 null
100 20 null
100 30 null
100 40 null
100 50 null
tableB的
a b c
100 10 99
100 20 88
100 30 77
100 40 66
首次合并后
表A
a b c
100 10 99
100 20 88
100 30 77
100 40 66
100 50 null
第二次合并后
表A
a b c
100 10 99
100 20 88
100 30 77
100 40 66
100 50 99
第一个语句更新所有必需的行,除了tableB中没有匹配行的行。因此,在第二个合并语句中,我使用tableB中某个硬编码行的另一个值更新该行。
答案 0 :(得分:0)
我希望,这应该有所帮助:
merge into tableA
using (select tt.a, tt.b, b.c
from (select tableA.a, tableA.b, nvl(tableB.b, '10') hardcoded_b
from tableA left join tableB on tableA.a = tableB.a and tableA.b = tableB.b) tt
join tableB b on tt.a = b.a and tt.hardcoded_b = b.b) t
on (tableA.a = t.a and tableA.b = t.b)
when matched then update set tableA.c = t.c;
在子查询t
中,我创建了一组行,其中tableB
中缺少的值填充了来自硬编码行的值。