我有两张桌子:
A列是我们将进行连接的列。我需要更新如下:
B = if(D not null) then D
else C
我试过了:
update Tab1 x
set B = case when
(select D from Tab2 t2
inner join Tab1 t1
on t1.A = t2.A
where t1.A = x.A) is not null
then (select D from Tab2 t2
inner join Tab1 t1
on t1.A = t2.A
where t1.A = x.A)
else x.D END
where x.A > (user_input) and x.A <= (user_input)
这使我的输出为:0行更新。
另外,作为一个注释,我需要在一个更新语句本身中执行此操作。表Tab1中还有其他非依赖列要在同一更新中更新。
我知道这看起来很乱,两次执行相同的选择子查询根本没有优化,但我真的不明白如何实现这一点。
任何帮助或指示都表示赞赏!
答案 0 :(得分:1)
我认为MERGE
是进行多表更新的最佳方法:
merge into tab1 t1
using tab2 t2
on (
t1.a = t2.a
and t1.a between 1 and 10 -- change this as needed
)
when matched then
update set t1.b = coalesce(t2.d, t1.c);
答案 1 :(得分:1)
应该是这样的
update Tab1 t1
set t1.B = nvl((select t2.d from Tab2 t2 where t2.a = t1.a), t1.c)
where t1.a = :user_input
顺便说一句,0 rows updated
与更新中的where条件有关。它似乎与表Tab1中的任何记录都不匹配 - 因此,您的语句where x.A > (user_input) and x.A <= (user_input)
将始终评估为false
答案 2 :(得分:0)
merge into tab1 t1
using tab2 t2
on ( t1.a = t2.a)
when matched then
update set t1.b = case when t2.d is not null then t2.d else t1.c end
;