oracle update 多个字段,能不能 只要其中一个字段有值 这条记录就不更新

penny9093 2014-10-21 04:59:51
oracle update 多个字段,能不能 只要其中一个字段有值 这条记录就不更新。
比如 :
update table_a
set (a, b, c ,d, e ,f ,g)
= ( select a, b, c ,d, e ,f ,g from table_b )
正常table_a中的 table_b中没有的记录会被置空, 如果那些记录有值的不想被置空怎么办?
...全文
771 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw555 2014-10-21
  • 打赏
  • 举报
回复
update table_a A
set (a,  b,  c ,d,  e  ,f  ,g) 
= ( select NVL(A.a,B.a),NVL(A.b,B.b),…… from table_b B where id=A.id )
where exists (select 1 from table_b B where id=A.id)
bw555 2014-10-21
  • 打赏
  • 举报
回复
楼上可能想多了,正常table_a中的 table_b中没有的记录会被置空,只要限定where条件不更新那部分就可以了
update table_a
set (a,  b,  c ,d,  e  ,f  ,g) 
= ( select a,  b,  c ,d,  e  ,f  ,g from table_b where id=table_a.id)
where exists (select 1 from table_b where id=table_a.id)
CT_LXL 2014-10-21
  • 打赏
  • 举报
回复
引用 2 楼 penny9093 的回复:
加个nvl或者decode函数就行了 如:
可以用merge into试试,如果不行就只能一个一个来update

MERGE INTO ta p
USING tb np
ON (p.c1 = np.c1 and p.c2 = np.c2) --连接条件
WHEN MATCHED THEN
  UPDATE
     SET p.c3 = nvl(np.c3, p.c3), p.c4 = nvl(np.c4, p.c4) --注意此处update的字段不能作为连接字段(不能更新c1,c2字段)
   WHERE p.c4 = 'sasfdsa' --可以叫条件过滤
penny9093 2014-10-21
  • 打赏
  • 举报
回复
加个nvl或者decode函数就行了 如: update ta set a=(select nvl(tb.a,ta.a) from tb);[/quote] 这个是不是只能用在 updata table_a set a =……, b =……,c=……,这种方式上,因为 更新有关联条件限制,所以想以这种 set (a, b, c ,d, e ,f ,g) = ( select a, b, c ,d, e ,f ,g from table_b ) 多个字段一起更新的方式, 这种方式的话,改怎么办?
CT_LXL 2014-10-21
  • 打赏
  • 举报
回复
引用 楼主 penny9093 的回复:
oracle update 多个字段,能不能 只要其中一个字段有值 这条记录就不更新。 比如 : update table_a set (a, b, c ,d, e ,f ,g) = ( select a, b, c ,d, e ,f ,g from table_b ) 正常table_a中的 table_b中没有的记录会被置空, 如果那些记录有值的不想被置空怎么办?
加个nvl或者decode函数就行了 如: update ta set a=(select nvl(tb.a,ta.a) from tb);

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧