寻找更好的解决方案 - 合并声明

时间:2017-08-03 14:38:31

标签: oracle plsql merge

我有两个合并语句,其中一个使用其他行的子集。有没有办法优化解决方案。

声明1

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;

声明2

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中某个硬编码行的另一个值更新该行。

1 个答案:

答案 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中缺少的值填充了来自硬编码行的值。