如何使用公共子 select 处理 Oracle 更新中没有返回的行

How to handle no rows returned in an Oracle update using a common sub-select

考虑更新:

UPDATE table1
SET c1 = NVL(( SELECT d1 FROM table2 WHERE table1.id = table2.id ), 0),
c2 = NVL(( SELECT d2 FROM table2 WHERE table1.id = table2.id ), 0)

NVL函数处理子select returns没有行的情况。

有没有什么好的方法可以使用这种类型的语法重写它(无需重复子select):

UPDATE table1 SET (c1,c2) = ( SELECT d1, d2 FROM table2 where table1.id = table2.id )

这样子 select returns 现在处理行的情况。

我会更改子选择以包含 t1 上的左外连接,然后在这种情况下对结果进行 nvl,例如:

drop table t1;
drop table t2;

create table t1 (col1 number, col2 number, col3 number);

create table t2 (col1 number, col2 number, col3 number);

insert into t1 values (1, 10, 100);
insert into t1 values (2, 20, 200);

insert into t2 values (1, 100, 1000);

commit;

update t1
set (col2, col3) = (select nvl(col2, 0), nvl(col3, 0)
                    from   (select a.col1, b.col2, b.col3
                            from   t1 a
                                   left outer join t2 b on (a.col1 = b.col1)) c
                    where  c.col1 = t1.col1);

commit;

select * from t1;

      COL1       COL2       COL3
---------- ---------- ----------
         1        100       1000
         2          0          0