大家来讨论下这种需求SQL能不能完成(关于Update一个字段)
有如下一张表:T1
F1 F2 F3 F1 F2 F3
1 a 1 a 01
1 b 1 b 02
2 c 2 c 01
2 d 2 d 02
2 e 2 e 03
3 f 3 f 01
1 g 1 g 03
第三个字段是空的。现在的问题是,我要更新第三个字段,数值是第一个字段的序列号。更新完变成右边的样子。
两个问题:
1、如果不用临时表能完成吗?
2、如果有临时表,如何实现?怎样写才更有效率?
数据一共有几万条,也不是很多。
------解决方案--------------------没有用存储过程,就是一条普通的UPDATE语句,你可以将文本文件通过BULK INSERT到SQL Server 2000中再做处理。
最开始的SQL语句少了一组 "() ",更正一下:
update t
set
F3=right( '0 '+rtrim((select count(*) from T1 where F1=t.F1 and F2 <=t.F2)),2)
from
T1 t
------解决方案--------------------1、不用ORDER BY。
2、不是 COUNT 一遍整张表。
3、有 10000 条记录,就 COUNT 10000 次,不需要 10000×10000 。
------解决方案--------------------create table tb(F1 int,F2 varchar(10),F3 varchar(10))
insert into tb values(1, 'a ', ' ')
insert into tb values(1, 'b ', ' ')
insert into tb values(2, 'c ', ' ')
insert into tb values(2, 'd ', ' ')
insert into tb values(2, 'e ', ' ')
insert into tb values(3, 'f ', ' ')
insert into tb values(1, 'g ', ' ')
go
--查询
select f1,f2,right( '00 '+cast(f3 as varchar),2) f3 from
(
select f1,f2,f3=(select count(1) from tb where f1=a.f1 and f2 <a.f2)+1 from tb a
) t
/*
f1 f2 f3
----------- ---------- ----
1 a 01
1 b 02
2 c 01
2 d 02
2 e 03
3 f 01
1 g 03
(所影响的行数为 7 行)
*/
--更改
update tb
set f3 = m.f3
from tb,
(
select f1,f2,right( '00 '+cast(f3 as varchar),2) f3 from
(
select f1,f2,f3=(select count(1) from tb where f1=a.f1 and f2 <a.f2)+1 from tb a
) t
) m
where tb.f1