日期:2014-05-18  浏览次数:20816 次

大家来讨论下这种需求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