【发布时间】:2017-02-02 14:33:52
【问题描述】:
我正在尝试使用一种复杂的源数据集更新表。有一个表格包裹,其中包含有关产品的库存信息。它还包含现场产品描述。该字段有时仍有一些旧的描述,需要通过基础数据表进行更新。
但连接表还需要通过由另一个子选择或连接完成的语言进行过滤。
SELECT products.DESCSH as old_desc
,parcel.DESCSH as new_desc
FROM parcel
,products
WHERE parcel.PRODU_INTERNUM = products.INTERNUM
AND parcel.NUM LIKE '2%REGEN'
and (SELECT COMPA.LANG FROM COMPA WHERE COMPA.NUM = parcel.COMPA_NUM) = products.LANG
and trim(upper(products.DESCSH)) <> trim(upper(parcel.DESCSH))
这是基本选择。 (任务基本上是用old_desc更新new_desc)
现在因为我不知道如何做到这一点,所以我在这里看到了 3 种方法。 MERGE 方法
merge into gc_prcel target
using (
Select p.descsh
,p.internum
from p
,par
where sysdate between p.vldty_beg and p.vldty_end
and p.internum = par.produ_internum
and p.lang = (SELECT COMPA.LANG FROM COMPA WHERE COMPA.NUM = par.COMPA_NUM)
) source
on (target.produ_internum = source.internum)
when matched then update
set target.descsh = source.descsh
where target.num like '2%REGENSDO'
and trim(upper(target.descsh)) <> trim(upper(target.descsh));
当它只应该更新 400 条记录并且我不知道为什么时它几乎更新了整个表,或者它陷入了无限循环(甚至更无能)。我知道这看起来很奇怪,我为那些 where 子句尝试了很多不同的地方,但没有一个有效。
带有 EXIST 子句的方法(我可以使用这个,但我发现其他方法更优雅)以及直接从子选择中更新字段的方法:
update
(SELECT products.DESCSH as old_desc
,parcel.DESCSH as new_desc
FROM parcel
,products
WHERE parcel.PRODU_INTERNUM = products.INTERNUM
AND parcel.NUM LIKE '2%REGENSDO'
and (SELECT COMPA.LANG FROM COMPA WHERE COMPA.NUM = parcel.COMPA_NUM) = products.LANG
and trim(upper(products.DESCSH)) <> trim(upper(parcel.DESCSH))) descriptions
set descriptions.new_desc = descriptions.old_desc;
这个抛出(ORA-01779:无法修改映射到非键保留表的列)
我正在尝试使用合并语句完成的任务,还是我必须使用存在的更新以及为什么我的第一种方法失败并出现 ORA-01779)
【问题讨论】: