首页 新闻 搜索 专区 学院

请教一个SQL语句解决重新编号问题

0
悬赏园豆:100 [已关闭问题]

 CREATE TABLE A(

ACODE VARCHAR(10),

ANO INT

)

INSERT INTO A(ACODE,ANO) VALUES(AAA,1) 

INSERT INTO A(ACODE,ANO) VALUES(AAA,2)

INSERT INTO A(ACODE,ANO) VALUES(BBB,3)

INSERT INTO A(ACODE,ANO) VALUES(CCC,4)

INSERT INTO A(ACODE,ANO) VALUES(CCC,5)

INSERT INTO A(ACODE,ANO) VALUES(BBB,6)

INSERT INTO A(ACODE,ANO) VALUES(DDD,7)

INSERT INTO A(ACODE,ANO) VALUES(EEE,8)

INSERT INTO A(ACODE,ANO) VALUES(FFF,9)

INSERT INTO A(ACODE,ANO) VALUES(FFF,10)

...

今有如上一表,存在的数据如上,现在想法把数据中ANO重新编号之后数据为:

AAA,1

AAA,2

BBB,1

CCC,1

CCC,2

BBB,2

DDD,1

EEE,1

FFF,1

FFF,2

 

高人们,都有哪些方法?有最简捷的法子是什么?如该数据是 ACCESS2003 中的 如何进行?

有最懒的方法吗?不想导入其他数据库和ADO.NET编码实现,有一条SQL语句实现的可能吗?

问题补充: 就是修改数据,原来有两字段的数据,其中NO为1,2,...N, 现在想按ACODE的分组后,对应的ACODE的NO重新编号,NO=1的时候就有很多ACODE
深水的猫的主页 深水的猫 | 初学一级 | 园豆:110
提问于:2008-08-30 10:31
< >
分享
其他回答(6)
0
看不懂~~~
丁学 | 园豆:18530 (专家六级) | 2008-08-30 17:08
0
继续解释下楼主的要求 比如有数据 AAA BBB AAA 则变成 AAA 1 BBB 1 AAA 2 就是说,ACODE相同的行,ANO才会identity…… 随便写一个,错了别怪我 insert into A (ACODE, ANO) select 'XXX', count(null) + 1 from A where ACODE = 'XXX';
Gray Zhang | 园豆:17610 (专家六级) | 2008-08-30 17:19
0
update A set ANO = ANO mod 2 update A set ANO = 2 where ANO = 0
deerchao | 园豆:8167 (大侠五级) | 2008-09-01 01:35
0
据我所知,在SQLServer2005中,只要新建一个字段 NO_Test, 设置他为Identifier,并且是自动增长,保存之后,你发现表里面这个字段自动完成了1~N的编号。不知道Access中能不能。你可以复制一份Access文件试试。 另外,你的这段程序相当恐怖,用两个循环来执行SQL。。。 我想第二句改成IF比较明朗一些吧。 ///////////////////////// 看错题意了说 ////////////////////////// 按照楼主的意思,应该如下(建议先复制一份): UPDATE tbl_People SET NO=( SELECT COUNT(p1.NO)+1 FROM tbl_People as p1 WHERE p1.NO<p2.NO AND p1.Name=P2.Name ) FROM tbl_People as p2
Hunts.C | 园豆:266 (菜鸟二级) | 2008-09-01 01:43
0
用存储过程来解决 首先你的表应该有一关键字段,或者自动增长的字段ID 步骤: declare @acodecount select @acodecount=count(acode) from 原表 group by ACODE into 临时表1--统计出有多少不同的acode 个数,用来下面的循环 declare @i int set @i=1 while @i<= @acodecount begin --步骤二: 循环体内:这里建个临时表2,以acode为条件的,如select * from 原表 where acode=(这里就需要用到上面的临时表1,用两个top的方式,来去第i行的acode字段值,这里你如果不清楚,可以网上找找2个top来生成分页存储过程的功能,方式都一样) 建好临时表2,样子应该是这样的,以AAA为例,如下: 临时表2 主id acode ano ... AAA 1 ... AAA 2 ... AAA 4 ... AAA ...(补充ano的列值得意思,ano的值可能是很乱的值,不用考虑他) 当取道临时表2,你就可以修改临时表2的内容了,修改的方式有多种,可以直接建个自动增长列,然后修改他的ano值,然后再根据原表id来修改原表的ano的值,具体sql,你思路清楚了,就没问题了. set @i=@i+1 end 希望我的回答能给你带来帮助:)
zjy | 园豆:3194 (老鸟四级) | 2008-09-01 11:32
0
如下是示范存贮过程: ALTER PROCEDURE MakeGroup AS CREATE TABLE #TargetTable(IndexId int IDENTITY (0, 1) NOT NULL, ACODE VARCHAR(10), ANO INT, IsSet bit) INSERT INTO #TargetTable(ACODE,ANO) VALUES('AAA',1) INSERT INTO #TargetTable(ACODE,ANO) VALUES('AAA',2) INSERT INTO #TargetTable(ACODE,ANO) VALUES('BBB',3) INSERT INTO #TargetTable(ACODE,ANO) VALUES('CCC',4) INSERT INTO #TargetTable(ACODE,ANO) VALUES('CCC',5) INSERT INTO #TargetTable(ACODE,ANO) VALUES('BBB',6) INSERT INTO #TargetTable(ACODE,ANO) VALUES('DDD',7) INSERT INTO #TargetTable(ACODE,ANO) VALUES('EEE',8) INSERT INTO #TargetTable(ACODE,ANO) VALUES('FFF',9) INSERT INTO #TargetTable(ACODE,ANO) VALUES('FFF',10) --IndexId int IDENTITY (0, 1) NOT NULL CREATE TABLE #T(IndexId int IDENTITY (0, 1) NOT NULL, ACODE VARCHAR(10)) INSERT INTO #T(ACODE) SELECT DISTINCT ACODE FROM #TargetTable WHERE (IsSet IS NULL); CREATE TABLE #Temp(IndexId int); DECLARE @number int SET @number = 1; DECLARE @total int DECLARE @tIndex int DECLARE @tTotal int SELECT @tTotal = COUNT(ACODE) FROM #T; SetGroupLoop: SET @tIndex = 0; DELETE FROM #Temp; GetGroupLoop: IF(@tIndex < @tTotal) BEGIN INSERT INTO #Temp(IndexId) SELECT TOP(1) IndexId FROM #TargetTable WHERE IsSet IS NULL AND ACODE IN (SELECT ACODE FROM #T WHERE IndexId = @tIndex); SET @tIndex = @tIndex + 1; GOTO GetGroupLoop; END SELECT @total = COUNT(IndexId) FROM #Temp IF(@total > 0) BEGIN UPDATE #TargetTable SET ANO = @number, IsSet = 1 WHERE IndexId IN (SELECT IndexId FROM #Temp) SET @number = @number + 1; GOTO SetGroupLoop; END SELECT * FROM #TargetTable ORDER BY ACODE 如下是运行结果: 正在运行 [dbo].[MakeGroup]. IndexId ACODE ANO IsSet ------- ---------- ------ ------ 0 AAA 1 True 1 AAA 2 True …… (见续)
陛下 | 园豆:3938 (老鸟四级) | 2008-09-03 12:16
0
DECLARE @t table(jj varchar(10)) INSERT INTO @t SELECT 'a' UNION ALL SELECT 'a' UNION ALL SELECT 'b' UNION ALL SELECT 'b' UNION ALL SELECT 'b' SELECT IDENTITY(INT,1,1) as id,* INTO #t from @t SELECT *,(SELECT COUNT(0) FROM #t b where a.jj=b.jj and a.id>=b.id) as times FROM #t a DROP TABLE #t
roboth | 园豆:28 (初学一级) | 2008-09-03 14:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册