Oracle:根据另一个表中的列更新列

时间:2017-09-09 12:19:54

标签: oracle sql-update case

我有两张桌子:

enter image description here

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中还有其他非依赖列要在同一更新中更新。

我知道这看起来很乱,两次执行相同的选择子查询根本没有优化,但我真的不明白如何实现这一点。

任何帮助或指示都表示赞赏!

3 个答案:

答案 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
;