Sql Oracle基于联接更新表

Sql Oracle基于联接更新表,sql,oracle11g,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 =

我有两张桌子

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处理远程数据库…我们正在讨论一百万行。

不确定它是否会比您已经完成的更快,但您可以尝试一下

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;

阅读之后,我发现这确实是一种不推荐使用的方法,应该使用
MERGE
语法。但是,根据您的系统,这可能具有更好的性能,合并通常比使用子查询的更新快很多(语法可能有点奇怪,但您会习惯的);这假设rm_示例具有主键列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;

我不认为“弃用”这个词在这里是正确的,因为它暗示了甲骨文的一些官方声明。即使与合并相比,此语句的性能也应该没有问题,事实上,它可以更紧凑、更直观,尤其是在只更新行子集的情况下。Oracle SQL性能问题通常需要执行计划,这也可以让您不必包含其他必要的细节,例如每个表中有多少行。这样做可能会更快,但基于内联视图的更新至少应该与性能匹配。同意,但OP没有使用这一点(他只使用子查询获取新值,IME几乎总是比MERGE慢得多)。