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慢得多)。