有以下表......
T1:
列名     A列       B列
数据    数据A      100
数据    数据A      100
数据    数据B      100
数据    数据A      100
数据    数据B      100
数据    数据A      100
数据    数据A      100*************************************
T2:
列名     A列       B列
数据    OX001      数据A
数据    OX002      数据B
*************************************
问题:
我想批量更新表T1,得出结果如下:
T1:
列名     A列       B列
数据    OX001      100
数据    OX001      100
数据    OX002      100
数据    OX001      100
数据    OX002      100
数据    OX001      100
数据    OX001      100------------------------------
鄂用以下的语句更新后,提示更新的数据太多。
update T1
set T1.A列=
(select T2.A列 from T2 where T2.B列=T1.A列)
但是,修改成这样后,可以。。
update T1
set T1.A列=
(select T2.A列 from T2 where T2.B列=T1.A列 and rounum<=1)
不过总感觉这样只限定下,会出现大数据的时候,更新遗漏的问题
求高手指点,谢谢

解决方案 »

  1.   

    方法一:
    采用存储过程,使用循环,限制更新的条数,效率不是很高。。
    方法二:
    建立和目标表一样的结构的临时表(基于事务的临时表,保证主键一样),使用视图更新的操作。
    update( select a.A列,b.A列 from t1 a,temp_t1 b where a.id=b.id) set a.A列=b.A列
    方法三:
    同样的使用临时表,根据插入产生的日志少于update的日志的办法,使用
    truncate table t1;
    create table t1 as select * from temp_t1;
      

  2.   

    T2:
    列名 A列 B列
    数据 OX001 数据A
    数据 OX002 数据B
    数据 OX003 数据B
    数据 OX004 数据A
    如果你T2中的数据是这样的 那么T1中的 '数据A' 要更新成哪个呢? 'OX001'或者'OX004'?
      

  3.   


    --你指的遗漏不明白是什么意思
    --如果数据量大,建议还是采用临时表来更新update T1 set T1.A列=
    (select T2.A列 from T2 where T2.B列=T1.A列 and rounum<=1)
    where exists(select 1 from T2 where T2.B列=T1.A列 )  --加上这句,避免勿更新一些资料!
      

  4.   

    那么临时表temp_t1中的数据是否也要从表t1中完全进行拷贝?
      

  5.   

    我总感觉在集联表中,加入rounum<=1的条件强制赛选1条数据,有点奇怪。
    我本身T2表中T2.B列=T1.A列这个条件就应该是能保证只赛选一条数据出来的。
    可是如果不用rounum<=1 用提示更新的数据太多,失败
      

  6.   

    --这样试试看
    update T1
    set T1.A列=
    (select T2.A列 from T2 where T2.B列=T1.A列)
    where exists(select null from T2 where T2.B列=T1.A列)
      

  7.   

    是的。。
    1.create table tmp_t1 as
    (select t1.列名,t1.B列.T2.A列 from T2,t1 where T2.B列=T1.A列).
    2。然后在tmp_t1上建立主键和t1表的一样
    3.
    update( select a.A列,b.A列 from t1 a,temp_t1 b where a.id=b.id) set a.A列=b.A列
      

  8.   

    你这问题就是1对多的问题所以你那样加个rownum<=1数据肯定是不行的建议先把a跟B表做个普通连接做个视图(临时表)  然后删除A中要跟新的数据 
    在insert into a select from 视图(临时表)