批量更新sql

haonanernet 2010-03-27 07:30:27
表A

id cID Name Age
1 A A1 12
2 A A2 34
3 A A3 33
4 A A4 34

5 B A1 22
6 B A2 33
7 B A3 44
8 B A4 43

求批量更新sql

要求更新表A中 cID = 'A' 的 age 字段。

B类别中Name 和 A类别的Name相同的age,我们把它更新A类的age中

更新后结果如下:

id cID Name Age
1 A A1 22
2 A A2 33
3 A A3 44
4 A A4 43

5 B A1 22
6 B A2 33
7 B A3 44
8 B A4 43

我这是一个例子,要更新的字段不止一个,更新的数据有几十万条,求高效的sql 更新语句
...全文
136 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
happy664618843 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 htl258 的回复:]

SQL code
create index idx_tb on tb(Name)
create index idx_tb on tb(cID)--如果CID本来有索引就不需要

update tb set
Age =(select top 1 Age from tb t where cID='b' and t.Name=tb.Name)
where cID='a'
再试试
[/Quote]
htl258_Tony 2010-03-28
  • 打赏
  • 举报
回复
create index idx_tb on tb(Name)
create index idx_tb on tb(cID)--如果CID本来有索引就不需要

update tb set
Age =(select top 1 Age from tb t where cID='b' and t.Name=tb.Name)
where cID='a'
再试试
zhengduan964532 2010-03-27
  • 打赏
  • 举报
回复


if OBJECT_ID('tb') is not null drop table tb
go
create table tb(id int, cID varchar(10), Name varchar(10),Age int)
insert tb select 1 ,'A','A1', 12
insert tb select 2 ,'A','A2', 34
insert tb select 3 ,'A','A3', 33
insert tb select 4 ,'A','A4', 34
insert tb select 5 ,'B','A1', 22
insert tb select 6 ,'B','A2', 33
insert tb select 7 ,'B','A3', 44
insert tb select 8 ,'B','A4', 43

SELECT * INTO TB1 FROM tb
WHERE cid='A'
SELECT * INTO TB2 FROM tb
WHERE CID='B'


SELECT * FROM TB1
SELECT * FROM TB2


MERGE DBO.TB1 AS Target
using(SELECT * FROM tb2) AS source
ON target.name=source.name
WHEN matched THEN
UPDATE
SET target.age=source.age
-----WHEN NOT matched BY target THEN
OUTPUT $action, Inserted.*, Deleted.*;

SELECT * FROM tb1
东那个升 2010-03-27
  • 打赏
  • 举报
回复
加索引了吗。
link1130 2010-03-27
  • 打赏
  • 举报
回复
顶学习一下~~~~~
haonanernet 2010-03-27
  • 打赏
  • 举报
回复
一样的慢。数据80多万应该不算多啊
htl258_Tony 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 haonanernet 的回复:]
以上几位兄弟的sql语句我测试了一下。A 类别300多条,B类80多万条。执行sql更新后 10 多分钟都没有完成。最后取消了。

实际生产环境中A类的 有50多万条,B类80多万条到时候执行起来怎么办呢
[/Quote]


update tb set 
Age =(select top 1 Age from tb t where cID='b' and t.Name=tb.Name)
where cID='a'
这样试试
haonanernet 2010-03-27
  • 打赏
  • 举报
回复
以上几位兄弟的sql语句我测试了一下。A 类别300多条,B类80多万条。执行sql更新后 10 多分钟都没有完成。最后取消了。

实际生产环境中A类的 有50多万条,B类80多万条到时候执行起来怎么办呢
永生天地 2010-03-27
  • 打赏
  • 举报
回复
create table #表A(id int, cID varchar(10), Name  varchar(10),Age int)
insert #表A select 1 ,'A','A1', 12
insert #表A select 2 ,'A','A2', 34
insert #表A select 3 ,'A','A3', 33
insert #表A select 4 ,'A','A4', 34
insert #表A select 5 ,'B','A1', 22
insert #表A select 6 ,'B','A2', 33
insert #表A select 7 ,'B','A3', 44
insert #表A select 8 ,'B','A4', 43

update a
set a.age=b.age
from #表A a,#表A b
where a.cid='A' and b.cid='B'
and a.name=b.name

select * from #表A

id cID Name Age
----------- ---------- ---------- -----------
1 A A1 22
2 A A2 33
3 A A3 44
4 A A4 43
5 B A1 22
6 B A2 33
7 B A3 44
8 B A4 43

(所影响的行数为 8 行)
htl258_Tony 2010-03-27
  • 打赏
  • 举报
回复

--> 生成测试数据表:tb
if OBJECT_ID('tb') is not null drop table tb
go
create table tb(id int, cID varchar(10), Name varchar(10),Age int)
insert tb select 1 ,'A','A1', 12
insert tb select 2 ,'A','A2', 34
insert tb select 3 ,'A','A3', 33
insert tb select 4 ,'A','A4', 34
insert tb select 5 ,'B','A1', 22
insert tb select 6 ,'B','A2', 33
insert tb select 7 ,'B','A3', 44
insert tb select 8 ,'B','A4', 43


update tb set
Age =(select Age from tb t where cID='b' and t.Name=tb.Name)
where cID='a'

select * from tb
/*
id cID Name Age
----------- ---------- ---------- -----------
1 A A1 22
2 A A2 33
3 A A3 44
4 A A4 43
5 B A1 22
6 B A2 33
7 B A3 44
8 B A4 43

(8 行受影响)
*/
东那个升 2010-03-27
  • 打赏
  • 举报
回复
create table #ta(id int, cID varchar(10), Name  varchar(10),Age int)
insert #ta select 1 ,'A','A1', 12
insert #ta select 2 ,'A','A2', 34
insert #ta select 3 ,'A','A3', 33
insert #ta select 4 ,'A','A4', 34

insert #ta select 5 ,'B','A1', 22
insert #ta select 6 ,'B','A2', 33
insert #ta select 7 ,'B','A3', 44
insert #ta select 8 ,'B','A4', 43



update a
set a.Age=b.age
from #ta a ,(select * from #ta where cid='B') b
where a.name=b.name and a.cid='A'

select * from #ta

id cID Name Age
----------- ---------- ---------- -----------
1 A A1 22
2 A A2 33
3 A A3 44
4 A A4 43
5 B A1 22
6 B A2 33
7 B A3 44
8 B A4 43

(8 行受影响)
feixianxxx 2010-03-27
  • 打赏
  • 举报
回复
update k 
set age=b.age
from a k join a b on k.name=b.name
where k.cid='A' and b.cid='B'

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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