【问题标题】: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。原来是数据问题。我应该意识到第二个表中有一个欺骗,因为错误类似于“单行子查询返回多行”。

标签: oracle sql-update


【解决方案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 人。谢谢你的例子。
    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多