oracle中如何批量更新某列数据

pgdoryoku 2010-12-21 09:01:32
有以下表......
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)
不过总感觉这样只限定下,会出现大数据的时候,更新遗漏的问题。。。
求高手指点,谢谢。。。
...全文
1248 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oraclefans_ 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pgdoryoku 的回复:]

引用 1 楼 oraclefans_ 的回复:
方法二:
建立和目标表一样的结构的临时表(基于事务的临时表,保证主键一样),使用视图更新的操作。
update( select a.A列,b.A列 from t1 a,temp_t1 b where a.id=b.id) set a.A列=b.A列

那么临时表temp_t1中的数据是否也要从表t1中完全进行拷贝?
[/Quote]
是的。。
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列


  • 打赏
  • 举报
回复
--这样试试看
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列)
pgdoryoku 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gelyon 的回复:]
SQL code

--你指的遗漏不明白是什么意思
--如果数据量大,建议还是采用临时表来更新

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列 ) --加上这句,避免勿更新一些资料!……
[/Quote]
我总感觉在集联表中,加入rounum<=1的条件强制赛选1条数据,有点奇怪。
我本身T2表中T2.B列=T1.A列这个条件就应该是能保证只赛选一条数据出来的。
可是如果不用rounum<=1 用提示更新的数据太多,失败
pgdoryoku 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oraclefans_ 的回复:]
方法二:
建立和目标表一样的结构的临时表(基于事务的临时表,保证主键一样),使用视图更新的操作。
update( select a.A列,b.A列 from t1 a,temp_t1 b where a.id=b.id) set a.A列=b.A列
[/Quote]
那么临时表temp_t1中的数据是否也要从表t1中完全进行拷贝?
pgdoryoku 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhuomingwang 的回复:]
T2:
列名 A列 B列
数据 OX001 数据A
数据 OX002 数据B
数据 OX003 数据B
数据 OX004 数据A
如果你T2中的数据是这样的 那么T1中的 '数据A' 要更新成哪个呢? 'OX001'或者'OX004'?
[/Quote]
大哥的思维真慎密,
那我假设T2中偶B列数据的唯一性约束。
gelyon 2010-12-21
  • 打赏
  • 举报
回复

--你指的遗漏不明白是什么意思
--如果数据量大,建议还是采用临时表来更新

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列 ) --加上这句,避免勿更新一些资料!
  • 打赏
  • 举报
回复
T2:
列名 A列 B列
数据 OX001 数据A
数据 OX002 数据B
数据 OX003 数据B
数据 OX004 数据A
如果你T2中的数据是这样的 那么T1中的 '数据A' 要更新成哪个呢? 'OX001'或者'OX004'?


Defonds 2010-12-21
  • 打赏
  • 举报
回复
用临时表吧
zh_666 2010-12-21
  • 打赏
  • 举报
回复
采用存储过程,使用循环,限制更新的条数,效率不是很高。。
我用过这种方式 ,效率上是不好,如果数据量不大,可以使用
Oraclefans_ 2010-12-21
  • 打赏
  • 举报
回复
方法一:
采用存储过程,使用循环,限制更新的条数,效率不是很高。。
方法二:
建立和目标表一样的结构的临时表(基于事务的临时表,保证主键一样),使用视图更新的操作。
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;
心中的彩虹 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 pgdoryoku 的回复:]
引用 5 楼 gelyon 的回复:
SQL code

--你指的遗漏不明白是什么意思
--如果数据量大,建议还是采用临时表来更新

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列 ……
[/Quote]
呵呵 这就是一对多的原因 怎么写都只是更新对应的连接条件一条
心中的彩虹 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 pgdoryoku 的回复:]
有以下表......
T1:
列名 A列 B列
数据 数据A 100
数据 数据A 100
数据 数据B 100
数据 数据A 100
数据 数据B 100
数据 数据A 100
数据 数据A 100

*************************************
T2:
列名 A列 B列
数据 OX001 数据A
数据 OX002 数据B
*****……
[/Quote]
你这问题就是1对多的问题所以你那样加个rownum<=1数据肯定是不行的

建议先把a跟B表做个普通连接做个视图(临时表) 然后删除A中要跟新的数据
在insert into a select from 视图(临时表)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧