相对于另一个表更新Oracle表

时间:2013-05-27 09:39:47

标签: sql oracle

我有两张桌子。

让我们说:

Table T1 with columns id,ref,a1,b1,c1,d1,e1
Table T2 with columns id,ref,a2,b2,c2,d2,e2

我需要在T2(a2,c2,e2)中针对T1(a1,c1,e1)T1.ref = T2.ref的{​​{1}}中的值更新一些列,ref=<certain value>

对于ref列的特定值,每个表中都有许多记录。

我想针对 T1 针对ref列的一个特定值更新 T2 。其他记录将不受影响。

我目前通过删除T2的所有行并插入T1 ref=<some value>的当前行来执行此操作。

例如:如果 ref值= 5

然后我会做这些步骤。

1. delete from T2 where ref=5;
2. insert into T2 (a2,c2,e2) select a1,c1,e1 from T1 where T1.ref = 5;

当然,这不是在两个表之间同步数据的好方法。

请建议我在Oracle中实现这一目标的有效解决方案。

我想我错过了一个重要的观点。这两个表都有一列清楚地标识每条记录。所以我不希望记录在T1中,而T1中没有。 只是重申 - 对于列“ref”的值,两个表都返回多个记录,并且每个记录都有一个唯一的标识列。 T1中确定的那些记录只需要存在于T2中。

提前致谢!

2 个答案:

答案 0 :(得分:0)

我想你想要这样的东西:

update t2 
  set (a2,c2,e2) = (select a1,c1,e1 from t1 where t1.ref = 5)
  where t2.ref = 5;

但是你必须确保嵌套查询只产生一行。

答案 1 :(得分:0)

如果T1和T2的每一行之间没有完全匹配,那么你的方法就足够了。

但是如果你有某种匹配尝试用merge实现你的逻辑:

MERGE INTO t2 b
USING (
  SELECT *
  FROM t1
  WHERE t1.ref = <value>) t1
ON (t2.<key> = t1.<key>)
WHEN MATCHED THEN
  UPDATE SET <t2.values> = <t1.values>  
WHEN NOT MATCHED THEN
  INSERT (<t2columns>)
  VALUES (<t1values>);