一个并不复杂的问题

zcxc 2003-05-11 09:44:05
有一个aaa表,如:

bh b1 b2 b3 b4
1 12345 12341 null null
2 12344 12345 null null
3 12345 12342 null null
4 12343 12345 null null
5 12345 12343 null null
6 12345 12344 null null
7 12344 12343 null null
8 12344 12321 null null
9 12312 12322 null null
10 12345 12323 null null
11 12321 12344 null null
12 12121 12212 null null
13 12323 12312 null null

b1、b2列可存在相同的数据,要在b1列中找出不同的数据,且要求在b1、b2列数据相同的情况下,在先出现的数据行的b3、b4列分别标上‘1’和bh列的号码,其余b1、b2列中相同的数据在b4列上标上bh列的号码。 可用下面存储过程实现。
CREATE proc cx
as
declare @sz int,@aa int
set @sz=1
select @aa=count(*) from aaa
while @sz<=@aa
begin
if exists (select b1 from aaa where bh=@sz and b3 is null and b4 is null)
begin
update aaa set b3=1 where bh=@sz
update aaa set b4=@sz where b1=(select b1 from aaa where bh=@sz) and b4 is null or b2=(select b1 from aaa where bh=@sz) and b4 is null
end
select @sz=@sz+1
end
return

得到结果如下:

bh b1 b2 b3 b4
1 12345 12341 1 l
2 12344 12345 null 1
3 12345 12342 null 1
4 12343 12345 null 1
5 12345 12343 null 1
6 12345 12344 null 1
7 12344 12343 1 7
8 12344 12321 null 7
9 12312 12322 1 9
10 12345 12323 null 1
11 12321 12344 null 7
12 12121 12212 1 12
13 12323 12312 null 9

问题是在数据量很大时,用while循环逐个查找,挺费时的。有没有更好的方法实现上述要求。

...全文
12 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zcxc 2003-05-11
高手们都休息了??????
回复
zcxc 2003-05-11
错了,b1的行8数据与行7相同,只是b4标上bh号码,行11也是一样。类似的,b1列的行9,行12的数据也算是第一次出现的数据。
回复
zcxc 2003-05-11
如:b1列的行1为‘12345’,属第一次出现不同的数据,那行1的b3标上‘1’,b4就填入bh的号码,在行3、5、6、10和b2的行2、4的‘12345’都与b1列的行1数据相同,故要求在b4相应的行中填入bh的号码。行2的b2列因已有‘12345’与行1的b1列‘12345’相同,故在b1列,行2的‘12344’数据不能算是第一次出现的不同的数据。只有b1的行7中‘12344’才算是第一次出现的数据,相应的b3、b4就分别标上‘1’和bh的号码。b1的行8中‘12344’与行7的第一次出现的数据的‘12344’相同,b3、b4就分别标上‘1’和bh的号码。这样的要求能用别的办法实现吗?
回复
hooboo 2003-05-11
没明白,B3,B4在什么条件下改变
回复
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2003-05-11 09:44
社区公告
暂无公告