数据库中的老数据,如何编新号?

sk9979 2003-10-16 10:05:54
有一张表有三个字段,编号,读者编号,读者类型
想利用读者类型来形成编号,如zf0001,zf0002,zf0003
gf0001,gf0002,gf0003等,如何用sql语句对数据库中的编号重新生成,因为老的编号有不规范.恳请各位大虾赐教!!!不胜感激!!!
...全文
24 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
online 2003-10-17
  • 打赏
  • 举报
回复
如果是sqlserver,使用游标,循环更新
declare @bh char(10)
declare @lx char(10)
declare tj cursor for
select 读者编号 from table
open tj
fetch tj into @bh
while @@fetch_status <> -1
begin
select 读者类型=@lx from table where 读者编号=@bh
if @lx='zf'
update 编号='zf'+@bh from table where lx='zf' and 读者编号=@bh
elseif @lx='gf'
update 编号='gf'+@bh from table where lx='gf' and 读者编号=@bh

fetch tj into @bh
end
close tj
deallocate tj

编号可能还是有问题,只能按照zf或者gf进行排列
或者写两个游标更新即可
如果是access,先导成sqlserver,转化后,导成access
CCEO 2003-10-17
  • 打赏
  • 举报
回复
SELECT 编号,读者编号,读者类型,IDENTITY(INT,1,1) AS ID
INTO #AA
FROM YOURTABLE
ORDER BY 读者编号,读者类型

update B set
编号=A.读者类型+right('0000'+cast((select sum(1) from #AA where 读者类型=A.读者类型 and ID<=A.ID) as varchar(10)),4)
from #AA A,YOURTABLE B
WHERE A.读者编号=B.读者编号
AND A.读者类型=B.读者类型
AND A.编号=B.编号

DROP TABLE #AA


gmlxf 2003-10-17
  • 打赏
  • 举报
回复
update yourtable set
编号=读者类型+'_'+right('0000'+cast((select sum(1) from yourtable where 读者类型=a.读者类型 and 读者编号<=a.读者编号) as varchar(10)),4)
from yourtable a
yoki 2003-10-17
  • 打赏
  • 举报
回复
update 表 set 编号=读者类型+'_'+right('0000'+cast((select sum(1) from 表 where 读者类型=a.读者类型 and 读者编号<=a.读者编号) as varchar),4)
from 表 a
zjcxc 2003-10-17
  • 打赏
  • 举报
回复
测试结果:


编号 读者编号 读者类型
---------- ----------- ----
gf_0001 1 gf
gf_0002 2 gf
gf_0003 3 gf
zf_0001 4 zf
zf_0002 5 zf
zf_0003 6 zf

(所影响的行数为 6 行)
zjcxc 2003-10-17
  • 打赏
  • 举报
回复
--下面是数据测试


--测试表
declare @表 table(编号 varchar(10),读者编号 int,读者类型 varchar(2))
insert into @表
select '1',1,'gf'
union all select 'w',2,'gf'
union all select '9',3,'gf'
union all select '8',4,'zf'
union all select '6',5,'zf'
union all select 's2',6,'zf'

--更新
update @表 set 编号=读者类型+'_'+right('0000'+cast((select sum(1) from @表 where 读者类型=a.读者类型 and 读者编号<=a.读者编号) as varchar),4)
from @表 a

--显示结果
select * from @表
zjcxc 2003-10-17
  • 打赏
  • 举报
回复
--上面的错了一点,改为:

update 表 set 编号=读者类型+'_'+right('0000'+cast((select sum(1) from 表 where 读者类型=a.读者类型 and 读者编号<=a.读者编号) as varchar),4)
from 表 a
gmlxf 2003-10-17
  • 打赏
  • 举报
回复
update yourtable set 编号=读者类型 + '_' +
right('000' + cast(读者编号 as varchar(10)),4)
zjcxc 2003-10-17
  • 打赏
  • 举报
回复
update 表 set 编号=读者类型+'_'+right('0000'+cast(select sum(1) from 表 where 读者类型=a.读者类型 and 读者编号<=a.读者编号) as varchar,4)
from 表 a
sk9979 2003-10-17
  • 打赏
  • 举报
回复
谢谢两位大虾,我用的是SQL server 7.0 的数据库


to online
你的给的游标并没有解决编号的问题,可能是我没有说清楚,我的数据库中的老编号不是按0001,0002排下来的,是乱排的,现在想把他们重新生成按规则的方式排列,既
编号 读者编号 读者类型
1 1 gf
w 2 gf
9 3 gf
8 4 zf
6 5 zf
s2 6 zf
想变成下面的方式
编号 读者编号 读者类型
gf_0001 1 gf
gf_0002 2 gf
gf_0003 3 gf
zf_0001 4 zf
zf_0002 5 zf
zf_0003 6 zf
sk9979 2003-10-17
  • 打赏
  • 举报
回复
to CCEO
我知道了,大虾的意思是产生唯一的编号是吧!
sk9979 2003-10-17
  • 打赏
  • 举报
回复
感谢各位大虾的鼎力支持!!!!
sk9979 2003-10-17
  • 打赏
  • 举报
回复
to CCEO
读者编号是可以重复的,请问产生“末一”的编号是什么意思啊?
CCEO 2003-10-17
  • 打赏
  • 举报
回复
如果原读者编号重复,那最安全的方法是用临时表,产生未一的编号,再用楼上几位的方法
CCEO 2003-10-17
  • 打赏
  • 举报
回复
如果原读者编号不重复,用楼上三位的方法就可以了,速度如何你自己测试,数据量大速度会比较慢。

不要用游标


xiaoxinghappy 2003-10-17
  • 打赏
  • 举报
回复
ACCESS 为什么要先导成SQL SERVER? 有必要吗?

ACCESS 里本身自到VB 编辑器,在里面写一模块可直接解决此问题。

在ACCESS 里新加一个模块

加入代码:

Sub ChangeID()
Dim Rst As Recordset
Dim lCount As Long
Set Rst=CurrentDB.OpenRecordset("Select 读者编号,读者类型 From Table")
lCount=1
Do While Not Rst.Eof
Rst.Edit
Rst![读者编号]=Rst![读者类型] & Right("0000" & lCount,4)
Rst.Update
Rst.MoveNext
Loop
Rst.Close
End Sub

按 F5 运行一下就可以了,前提是没有规则约束,否则应先解除各项规则约束。

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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