0

我有两张桌子。

让我们说:

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

鉴于此,我需要根据whereT2(a2,c2,e2)中的值更新几列。T1(a1,c1,e1)T1.ref = T2.refref=<certain value>

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

我想针对 ref 列的一个特定值相对于T1更新T2 。其他记录将保持不变。

我目前正在通过删除所有行并从whereT2插入当前行来执行此操作。T1ref=<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 中实现这一目标的有效解决方案。

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

提前致谢!

4

2 回答 2

0

我猜你想要类似的东西:

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

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

于 2013-05-27T09:55:36.167 回答
0

如果您在 T1 和 T2 的每一行之间没有精确匹配,那么您的方法就足够了。

但是,如果您有某种匹配,请尝试使用合并来实现您的逻辑:

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>);
于 2013-05-27T10:02:19.633 回答