sql - 当 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);
我不是专家,但不再是菜鸟。我已经使用谷歌破解了它。感谢您的帮助。
解决方案
您的第二个查询应该是:
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
推荐阅读
- ruby-on-rails - 带有 Rails 的 SameSite 属性问题
- html - 表格的 CSS 在 Outlook 2016 中不起作用
- laravel - 按 Laravel 过去 24 小时内的关系计数排序?
- reactive-programming - 在反应流扫描(),原子等中保持状态的有效方法?
- c# - 当 tag = "number" 使用 C# 时,如何从别名中获取 "Some text"?
- c# - 尝试将字符串条目解析为双精度,但小数点永远无法识别
- data-structures - No of Islands 问题的时间复杂度
- javascript - 是否有任何其他选项可以在 ec2 实例上运行多个节点应用程序
- android - 如何在Android中进行连续语音识别,即使手机被锁定也能运行?
- javascript - 超过最大更新。进入无限循环