我有一个表A有列(id,field_1,field_2),
而另一个表B有列(id,field_2)

现在我想将表B合并到A,这意味着我想将表A中的field_2更新为表B的值。那么如何实现呢?顺便说一句,我正在使用oracle

感谢

评论

两个表是否包含相同数量的记录?

#1 楼

共同相关的子查询(由Kerri建议)的另一种方法是使用MERGE语句,该语句可能比子选择更有效(只能通过查看两个语句的执行计划进行验证)。

MERGE INTO table_b 
USING 
(
  SELECT id,
         field_2
  FROM table_a
) ta ON (ta.id = table_b.id)
WHEN MATCHED THEN UPDATE 
    SET table_b.field_2 = ta.field_2


评论


对MERGE语句的唯一限制是您不能更新它所连接的列,即,您不能更新ON子句中使用的列。

– Lalit Kumar B
2015年11月4日在7:08

这对我有用,更新了250万行,而尝试使用子查询方法可能要花45分钟才能出现ORA-01555错误:快照太旧

–helmy
18年1月17日,2:13

#2 楼

不确定是否要完成此任务,但这应该是一次性的,也可以通过计划的作业连续进行:

UPDATE table_a a
   SET field_2 = ( SELECT field_2
                     FROM table_b b
                    WHERE b.id = a.id )
;


现在,每次执行上面的操作,它将在表的所有行中执行此操作。如果这是您始终需要做的事情,那么我建议您采取其他措施,但是对于一次性或很小的桌子来说,就足够了。

#3 楼

我已成功使用user1中的一个表从user2中的另一个表成功完成了此操作:

update user1.table1 a
set a.field1 = (
  select b.field1
  from user2.table2 b
  where a.field1=b.field1
)
where <condition for update user1.table1>


#4 楼

您可以在tableB上创建一个触发器,该触发器在每次更新tableB上的field_2时都会更新tableA。在此处查看有关创建触发器的更多信息-http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm#BABCIBBJ

评论


不相关的答案

– CleanBold
16年8月10日在8:31