Oracle基于连接更新表

时间:2013-07-16 05:44:39

标签: sql oracle11g

我有两张桌子

table 1 : rm_example(customer, weekno, salenum, card_type,...., imputed)
table 2 : rm_dummy(customer, weekno, imputed)

表1中的插补列为空(所有列)。

我想设置"估算"表1中的列值为"估算"在表2中,customer和weekno匹配....

在我写的查询下面.....但是它需要永远执行......

update rm_example e 
set e.imputed = 
      (select imputed  
       from rm_dummy d 
       inner join rm_example e on e.customer=d.customer and e.weekno=d.weekno)...

查询有问题吗?

我正在使用sqldeveloperplus处理远程数据库......我们正在讨论数百万行。

2 个答案:

答案 0 :(得分:1)

MERGE通常比带有子查询的UPDATE快一点(语法可能看起来有点奇怪,但你会习惯它);假设rm_example具有主键列PK:

MERGE INTO rm_example target
USING 
  (SELECT e.pk as e_pk,
          d.imputed  
   FROM rm_dummy d 
   INNER JOIN rm_example e ON e.customer=d.customer AND e.weekno=d.weekno) src
ON (target.pk = src.e_pk)
WHEN MATCHED THEN UPDATE
  SET target.imputed = src.imputed;

答案 1 :(得分:0)

不确定它是否会比你已经完成的更快但你试试这个

UPDATE
  (SELECT e.imputed, d.imputed
   FROM rm_example e 
   INNER JOIN rm_dummy d ON e.customer = d.customer AND e.weekno = d.weekno)
SET e.imputed = d.imputed;

阅读8 Bulk Update Methods Compared (Oracle)后,我发现这是一个不推荐的方法,应该使用MERGE语法。但是,根据您的系统,这可能会有更好的性能