我有两张桌子。
让我们说:
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中。
提前致谢!
答案 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>);