首页 > 解决方案 > 当 tbl_2.valueC 等于 tbl_1valueD 时更新 tbl_1 设置 tbl_1.valueA = tbl2.valueB

问题描述

如标题所示 - 我正在尝试根据 2 个表中的公共值(但列名不同)用另一个 table.value 更新 table.value

首先,我删除源表中的所有重复记录。并计算剩余的行 - 总数为 93。

Select rowid, xfmid_value from w_valve_reftest;
Delete from w_valve_reftest a
where rowid> (select min(rowid)
from w_valve_reftest b where b.xfmid_value=a.XFMID_VALUE);
Select count(*) from w_valve_reftest;

接下来我想用 source.ref1_value 的值更新 target.reference_1,用 source.ref2_value 更新 target.reference_2,其中 source.xfmid_value=target.xfm_id

这是我所拥有的,但由于某种原因,它正在更新 17,000 多条记录。而不是我期望的93。

update w_isolationvalve
set w_isolationvalve.reference_1=(select ref1_value from w_valve_reftest where w_isolationvalve.xfm_id=w_valve_reftest.xfmid_value);

update W_isolationvalve
set w_isolationvalve.reference_2=(select ref2_value from w_valve_reftest where w_isolationvalve.xfm_id=w_valve_reftest.xfmid_value);

我不是专家,但不再是菜鸟。我已经使用谷歌破解了它。感谢您的帮助。

标签: sqloraclejoinsql-update

解决方案


您的第二个查询应该是:

update a
set reference_1=b.ref1_value,
refrence_2=b.ref2_value 
FROM w_isolationvalve a
JOIN w_valve_reftest b ON a.xfm_id=b.xfmid_value

至于更新计数,只有当 xfm_id 和 xfmid_value 唯一时才为 93。

还要小心非确定性更新。如果您的选择将针对您的连接条件有多个结果,则将为多个结果中的每一个执行一次更新,您将不知道最终会得到什么。

这应该在 Oracle 中工作:

MERGE INTO w_isolationvalve  a
USING
(
SELECT * FROM w_valve_reftest 
)b
ON(a.xfm_id = b.xfmid_value)
WHEN MATCHED THEN UPDATE SET
a.reference_1 = b.ref1_value,
a.refrence_2 = b.ref2_value ;

既然你不喜欢合并。我认为这也应该适用于 Oracle:

UPDATE 
(SELECT a.reference_1, a.refrence_2, b.ref1_value , b.ref2_value
 FROM w_isolationvalve  a
 INNER JOIN w_valve_reftest b
 ON a.xfm_id = b.xfmid_value
) t
SET t.reference_1  = t.ref1_value ,
t.refrence_2 =t.ref2_value 

推荐阅读