update两张表更新oracle_oracle update 更新两张表的多个字段 - CSDN
精华内容
参与话题
  • oracle:一个update修改两张表

    千次阅读 2019-01-14 15:19:42
    需求:用一个update语句修改两张表? 思路:用触发器来解决 触发器代码: a:table_a,b:table_b,其中b里面有a的id,这个触发器意思是当修改a的最后修改人:table_a_last_chg_usr时,让b的最后修改...

    需求:用一个update语句修改两张表?

    思路:用触发器来解决

    触发器代码:

    表a:table_a,表b:table_b,其中表b里面有表a的id,这个触发器意思是当修改表a的最后修改人:table_a_last_chg_usr时,让表b的最后修改人字段也跟着修改table_b_last_chg_usr

    create or replace trigger 
        table_a_demo after update
        on table_a
        for each row 
        begin 
            update table_b set table_b_last_chg_usr = :new.table_a_last_chg_usr where table_a_id = :old.table_a_id;
        end ;

    要执行的修改表a的语句:

    update table_a a set a.last_chg_usr='testDemo' where a.table_a_id ='101'

    知识点补充:

           new关键字和old关键字:

    ------最佳解决方案--------------------
    oracle默认的 用old代表老数据 new代表新数据 不过二者在使用时是有限制的
    insert时 只有:new 没有:old 
    delete时 只有:old 没有:new
    update时 二者都可用

    ------其他解决方案--------------------
    :new --为一个引用最新的列值;
    :old --为一个引用以前的列值; 

    这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old; 

    for each row:对表的每一行触发器执行一次。如果没有这一选项,即使变更多行则只对整个表执行一次。

     

    展开全文
  • 现需求:参照T2,修改T1,修改条件为两表的fname列内容一致。 方式1,update 常见陷阱: UPDATE T1 SET T1.FMONEY = (select T2.FMONEY from t2 where T2.FNAME = T1.FNAME) 执行后T1结果如...

    创建如下表数据

    select * from t1 ;

    select * from t2;

    现需求:参照T2表,修改T1表,修改条件为两表的fname列内容一致。

    方式1,update

    常见陷阱:

    UPDATE T1 
    SET T1.FMONEY = (select T2.FMONEY from t2 where T2.FNAME = T1.FNAME)

    执行后T1结果如下:

    有一行原有值,被更新成空值了。

    正确写法:推荐

    UPDATE T1 
    SET T1.FMONEY = (select T2.FMONEY from t2 where T2.FNAME = T1.FNAME)
    WHERE EXISTS(SELECT 1 FROM T2 WHERE T2.FNAME = T1.FNAME);

    方式2:内联视图更新

    UPDATE (
    select t1.fmoney  fmoney1,t2.fmoney  fmoney2 from t1,t2 where t1.fname = t2.fname
    )t
    set fmoney1 =fmoney2;

    方式3:merge更新

    merge into t1
    using (select t2.fname,t2.fmoney from t2) t
    on (t.fname = t1.fname)
    when matched then 
      update  set t1.fmoney = t.fmoney;

     

    方法一(推荐):

    UPDATE 表2
      SET 表2.C =
         (SELECT B
           FROM 表1
          WHERE 表1.A = 表2.A)
     WHERE EXISTS
         (SELECT 1
           FROM 表1
          WHERE 表1.A = 表2.A);

    尤其注意最后的外层where条件尤为重要,是锁定其批量更新数据的范围。

    方法二:

    MERGE INTO 表2
       USING 表1
        ON (表2.A = 表1.A)                    -- 条件是 A 相同
    WHEN MATCHED
    THEN
      UPDATE SET 表2.C = 表1.B                   -- 匹配的时候,更新

     

    展开全文
  • 更新字段 在mysql 中用习惯了   update tb1 a,tb2 b set a.name=b.name where a.id=b.id and a.age=10   放到oracle里缺失set关键字   改成 update tb1 a set a.name=(select name from tb2 b where a.id...

    更新字段 在mysql 中用习惯了

     

    update tb1 a,tb2 b set a.name=b.name where a.id=b.id and a.age=10

     

    放到oracle里缺失set关键字

     

    改成

    update tb1 a set a.name=(select name from tb2 b where a.id=b.id)

     

    where a.age=10

    展开全文
  • A、B两张表,通过关联字段复制B中数据到Aupdate A a set a.A2 = (select b.B2 from B b where b.B1=a.A1) where exists (select 1 from B where B.B1=a.A1) 写成 update A a set a.A2 = (select b.B2 from B...

    A、B两张表,通过关联字段A1=B1,复制B表字段B2中数据到A表A2中

    update A a set a.A2 = (select b.B2 from B b where b.B1=a.A1) where 
    exists (select 1 from B where B.B1=a.A1)

    写成如下

    update A a set a.A2 = (select b.B2 from B b, A c where b.B1=c.A1) where 
    exists (select 1 from B where B.B1=a.A1)
    则是从两个表交叉集合取值,错误结果




    参考自http://www.2cto.com/database/201304/202364.html
    展开全文
  • 1) 两表(多)关联update -- 仅在where字句中的连接 SQL 代码 --这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别 update customers a -- 使用别名 set customer_type='01' --01 为vip,00为...
  • 转自:... .Oracle没有update from语法,可以通过种实现方式: 1、利用子查询:  update A   SET 字段1=(select 字段表达式 from B WHERE ...
  • update inner join 使用

    千次阅读 2015-12-01 16:48:12
    假定我们有两张表,一张为Product存放产品信息,其中有产品价格列Price;另外一张是ProductPrice,我们要将ProductPrice中的价格字段Price更新为Price中价格字段的80%。  在Mysql中我们有几种手段可以...
  • (多)关联update 超过个字段以上

    万次阅读 2019-01-03 17:20:14
    创建临时使用的 tt 多关联多字段update
  • 有下面:将tab1中id值与和tab2中id值相同的行的val更新为tab2中val的值. select * from tab1; select * from tab2 最容易犯的错误是:update tab1 set val=(select val from tab2 where tab1...
  • 转自:http://www.2cto.com/database/201205/130987.html有下面:将tab1中id值与和tab2中id值相同的行的val更新为tab2中val的值. select * from tab1; select * from tab2 最容易犯的错误是:update ...
  • 有下面:将tab1中id值与和tab2中id值相同的行的val更新为tab2中val的值.  select * from tab1;    select * from tab2  最容易犯的错误是:update tab1 set val=(select val from tab2 where ...
  • oracle大量数据更新优化(merge)

    万次阅读 2017-02-28 11:45:34
    两张1.5亿数据量的,一张中有字段name,大概有5000万左右为null,另一张name字段不为null,两张表可通过主键id关联。现在省略去不必要的字段,以及分区等构造两张实验: SQL> CREATE TABLE p...
  • 有一张临时 , 数据总数100w条, 其中 50w条 , state = 1 50w条 , state = 0 因为数据无用 , 所以需要 更新 所有数据的 state 为 1 ; 环境 数据库 : oracle 11g 操作系统 : win10 开发工具: PL/SQL 方案:...
  • update wx_weather a set (a.high_l,a.low_l)= (select high_l, low_l from wx_original_weather b where a.date_l=b.date_l)  where a.date_l in (SELECT date_l from wx_original_weather)
  • Oracle 四种update方法总结

    千次阅读 2017-06-27 10:27:35
    Oracle 四种update方法总结 Oracle除了提供标准的update语句之外还提供了其他的一些数据更新方式以应对不同的应用场景:标准Update语句,Update join view,merge into,游标
  • task 任务 ...两表之间必须有关联的字段 update task t set t.roleName = ( select r.name from role r where r.id=t.roleid ) 转载于:https://www.cnblogs.com/javaLin/p/9492333.html...
  • 数据库 update后where语句中的IN、EXISTS的效率测试
  • ora-01410 无效的rowid

    万次阅读 2015-05-13 10:04:15
    最近在做的for update操作时,报错:ora-01410 无效的rowid,查了一下 发现是 两张表关联for update导致的。 所以改成单个for update; 解决! 
  • Oracle 批量修改数据-Merge 使用小结

    千次阅读 2017-12-21 10:04:31
    在近期的需求中遇到了匹配两表的关联字段,修改主的字段业务。由于是批量修改接触到了Oracle的merge遇到新的知识,本人首先去了解了一下基本概念:MERGE语句是SQL语句的一种。在SQL Server、Oracle数据库中可用,...
  • ORACLE数据库更新大批量数据案例

    千次阅读 2018-09-13 13:43:18
    对数据库大批量数据两张表联合更新的一次经历 大约5W行数据,且对ID创建了索引,更新耗费大概12分钟,及其耗时间,于是百度了一下,写了一个游标如下 declare cursor cur is--声明游标cur select B.openid,A.ID...
1 2 3 4 5 ... 20
收藏数 37,776
精华内容 15,110
关键字:

update两张表更新oracle