用另一个表中的值更新一个表
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 人。谢谢你的例子。以上是关于用另一个表中的值更新一个表的主要内容,如果未能解决你的问题,请参考以下文章