正如标题所示-我正在尝试基于两个表中的公共值(但不是相同的列名)用另一个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 where source.xfmid_value=target.xfm_id更新target.reference_2
这就是我所拥有的,但由于某些原因,它正在更新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);我不是专家,但也不再是新手了。我已经用谷歌破解了这个问题。谢谢你的帮助。
发布于 2020-04-27 01:15:24
您的第二个查询应该是:
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。
还要注意非确定性更新。如果对于联接条件,select将有多个结果,则将对多个结果中的每个结果执行一次更新,而您将不知道最终得到的结果是什么。
这在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 https://stackoverflow.com/questions/61444661
复制相似问题