仅当目标表不为空时才更新目标表

时间:2013-07-16 18:57:29

标签: sql oracle plsql

我有一个场景,我们想在oracle表中更新40列。 source是另一个oracle表。

  1. 如果列的值为null,他们想要igonore列的值!!
  2. 示例:

    col1 col2 col3 
    1    null  b
    2    null  3 
    

    目标表:

    col1 col2 col3
    1     a    null
    2     b    null
    

    更新后。

    col1 col2 col3
    1     a   b
    2     b   3 
    

    注意:只有当它不为空时我们才必须升级..

    任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:3)

update target_table tt
   set (col1, col2, col3) = ( select nvl(st.col1,tt.col1), 
                                     nvl(st.col2,tt.col2), 
                                     nvl(st.col3,tt.col3) 
                                from source_table st where st.primary_key = tt.primary_key )
 where exists ( select null 
                  from source_table st 
                 where st.primary_key = tt.primary_key
                   and (st.col1 is not null 
                        or st.col2 is not null 
                        or st.col3 is not null) );

显然你必须确定主键是什么。我只使用“primary_key”作为指导性指南。

答案 1 :(得分:3)

尝试

MERGE INTO TARGET_TABLE t
  USING SOURCE_TABLE s
    ON (s.COL1 = t.COL1)
  WHEN MATCHED THEN
    UPDATE SET t.COL2 = NVL(t.COL2, s.COL2)
               t.COL3 = NVL(t.COL3, s.COL3);

我在这里假设COL1是用于在TARGET_TABLE和SOURCE_TABLE中查找匹配行的列。

分享并享受。