使用左连接的值对表进行更新很容易。 我想做这样的事情:
UPDATE tbl1 p
LEFT JOIN (
select column1 , column2 from tbl2
union
select column1,column2 from tbl3
) c on c.column2=p.column2
SET p.column1 = nvl(c.column1, 'dummy');
答案 0 :(得分:1)
UPDATE p SET p.column1 = nvl(c.column1, 'dummy')
from tbl1 p
LEFT JOIN (
select column1 , column2 from tbl2
union
select column1,column2 from tbl3
) c on c.column2=p.column2
答案 1 :(得分:1)
我建议将此表示为:
UPDATE tbl1 p
SET p.column1 = COALESCE((SELECT column1 from tbl2 t2 WHERE t2.column2 = p.column2),
(SELECT column1 from tbl3 t3 WHERE t3.column2 = p.column2),
'dummy'
);
每个子查询都可以使用索引,因此它也应具有更好的性能。
答案 2 :(得分:0)
尝试看看下面的代码是否能使CTE发挥作用
Update tbl1 p
set column1 = nvl((with CTE as
(select column1 , column2 from tbl2
union
select column1,column2 from tbl3) select column1 from CTE where CTE.column2= p.column2 ),'dummy');
答案 3 :(得分:0)
使用merge
:
merge into tbl1 tgt
using (select min(column1) column1, column2
from (select column1, column2 from tbl2 union all
select column1, column2 from tbl3)
group by column2) src
on (tgt.column2 = src.column2)
when matched then update set tgt.column1 = src.column1
假设您有以下表格:
create table tbl1(column1, column2) as (
select 0, 'A' from dual union all
select 0, 'B' from dual union all
select 0, 'C' from dual union all
select 0, 'D' from dual );
create table tbl2(column1, column2) as (
select 1, 'A' from dual union all
select 41, 'D' from dual );
create table tbl3(column1, column2) as (
select 2, 'B' from dual union all
select 42, 'D' from dual );
我们在{{1}中具有键A
的值,在tbl2
中具有B
的值,在两个源表中都没有tbl3
的值,我们键C
有两个有问题的值。您必须决定在最后一种情况下该做什么,对字符串使用D
,min()
或avg()
之类的任何聚合函数。如果这种情况是不可能的,那么您可以简化我的声明,将源子查询替换为简单的并集。
您还可以使用listagg()
,但是在这种情况下,您必须添加update
子句并检查键的存在,以避免使值无效,这会使代码更长。
where
的结果
merge:
答案 4 :(得分:0)
如果可以在“匹配时”和“未匹配时”中更新相同的字段,那么合并语句可能是完美的解决方案。无论如何,我这样修复它: 使用过程从外部表填充表。 将过程插入语句中的所有记录的字段设置为“虚拟”,并且在工作后按预期使用MERGE WHEN MATCHED
PS:我无法像@OndřejCrha所说的那样工作。