用另一个表中的值更新一个表

Posted

技术标签:

【中文标题】用另一个表中的值更新一个表【英文标题】:Updating one table with values from another table 【发布时间】:2020-03-18 04:19:36 【问题描述】:

抱歉这个非常基本的新手数据库问题...

我有两个具有相同列的表,但我想将第一个表中的一个列的值替换为第二个表中相应列的值。

即table1:姓名、年龄 table2:姓名、年龄

每个表都有相同的“名称”值,只是年龄不同。

算法:对于table1中的每一行,找到table2中同名的行,使table1.age = table2.age

数据库是甲骨文。我试过类似的东西

update table1 set table1.age = (select table2.age where table2.name = table1.name)

认为它可能会在需要时进行隐式连接,但没有运气。我也尝试过明确地进行内部连接,但没有运气。

谢谢!

【问题讨论】:

您编写的查询看起来完全没问题。 “没有运气”是什么意思?你收到错误了吗?什么都没发生(即没有更新行)?如果可能,发布一个测试用例(通过编辑问题,而不是作为评论)。 您是否收到类似ORA-01427 的错误消息? 等待认真讨论如何使用常识来存储“年龄”而不是日期...。您真的希望在日期到来时使用新年龄更新表格(您从未保存的日期..因此您得到的信息不一致) 感谢大家的回答和 cmets。原来是数据问题。我应该意识到第二个表中有一个欺骗,因为错误类似于“单行子查询返回多行”。 【参考方案1】:

MERGE 通常比标量子查询快

merge into table1 t1
using table2 t2 on (t1.name = t2.name)
when matched then update
  set age = t2.age;

【讨论】:

【参考方案2】:

除了子查询中的 from 子句外,您什么也没有错过:

update table1 t1
   set t1.age =
       (select t2.age 
          from table2 t2
         where trim(t2.name) = trim(t1.name) )

并且使用trim() 将是针对字符串类型值周围(前导和尾随)空格的不错选择。

【讨论】:

谢谢巴巴罗斯。缺少选择是一个错字。关于修剪的好提示。【参考方案3】:

尝试使用 pl/sql 循环:

begin 
for t2 in (
    select name, age
    from table2
    )
loop
    update table1 t1
    set t1.age=t2.age where t1.name = t2.name; 
end loop;
end;

但是,它根本没有效率。

【讨论】:

这是效率最低的解决方案。 对我来说效率较低是可以的,因为我的数据相对较少。我很欣赏 PL/SQL 的编程方法。对我来说更自然,因为我更像是一个程序员而不是 db 人。谢谢你的例子。

以上是关于用另一个表中的值更新一个表的主要内容,如果未能解决你的问题,请参考以下文章

用另一个表中的值更新一个表

用另一个表上的值更新新添加的列

用另一个表中的最早日期更新表

用另一个表中的最新值更新

用另一个表中的数据更新一个表[重复]

用另一个表中的随机条目更新表的列