您的位置:首页 > 其它

用游标进行的简单数据统计更新

2006-05-16 18:58 363 查看
下面是在设计系统时需要解决的一个问题:

有两个表:

用户表:

用户ID 用户名 发表日志数

1 A 2

2 B 10

文章表:

文章ID 发表者 ……

1 A

2 A

3 A

4 B

我需要先从文章表里读出每个用户的发表数,然后更新用户表里的“发表日志数”当然,可以通过在用户发表文章时,就更新该用户的发表日志数,这也不会影响什么系统性能的。不过我还是采用SQL语句(过程)来实现,而且是后台管理员单独操作、且不需要经常性的操作,所以对前台程序的运行几乎没任何影响,当然在一开始我也想采用临时表的方法来更新统计的,但后来想想, 如果通过临时表来处理,假如数据量非常大的时候怎么办?会不会出现问题……经朋友们的建议,使用下游标,着实方便,把前台要处理的,放到后台数据层做……实现方式

declare my_cursor cursor scroll dynamic /*后面跳到第一行 需要定义scroll dynamic*/

for

SELECT mem_Name,mem_PostLogs,mem_PostComms FROM blog_Member

open my_cursor

declare @name nvarchar(24)

declare @PostLog int

declare @PostComm int

fetch next from my_cursor into @name,@PostLog,@PostComm

while(@@fetch_status=0)

begin

fetch next from my_cursor into @name,@PostLog,@PostComm

update blog_Member set mem_PostLogs=(SELECT COUNT(log_ID) FROM blog_Content WHERE

log_Author=@name) WHERE
mem_Name=@name

update blog_Member set mem_PostComms=(SELECT COUNT(comm_ID) FROM blog_Comment

WHERE comm_Author=@name) WHERE
mem_Name=@name

end

fetch first from my_cursor into @name,@PostLog,@PostComm

update blog_Member set mem_PostLogs=(SELECT COUNT(log_ID) FROM blog_Content WHERE

log_Author=@name) WHERE
mem_Name=@name

update blog_Member set mem_PostComms=(SELECT COUNT(comm_ID) FROM blog_Comment WHERE

comm_Author=@name) WHERE
mem_Name=@name

close my_cursor

deallocate my_cursor



=========================================下面是CSDN的朋友们提供的解决方法

用表变量或者临时表都可以

declare @temp table(name varchar(50),count int);

insert into @temp select name,count(ID) from tableB group by name;

得到临时表里面有文章数

下面可以用游标来更新TableA的内容

declare @count int

declare @name varchar(50)

declare cursor_a cursor

for select name, count from @temp

open cursor_a

fech next from cursor_a into @name,@count

while @@FETCH_STATUS=0

begin

update TableA set count = @count where name=@name

fech next from cursor_a into @name,@count

end

close cursor_a

deallocate cursor_a

======================================第三种非常简单的方法======

update blog_Member set mem_PostLogs=(select count(log_ID) from blog_Content where log_Author=blog_Member.mem_Name)

update blog_Member set mem_PostComms=(select count(comm_ID) from blog_Comment where comm_Author=blog_Member.mem_Name)

====================================================================

users表有字段 id int identity, username varcahr(10), articleCount int

articles表有字段 id int identity, username varcahr(10)

那么可以这样处理:

declare @userName varchar(10), @articleCount int

DECLARE user_Cursor CURSOR FOR

SELECT a.username, a.articleCount FROM (select username, count(id) as articleCount from articles group by username) a

OPEN user_Cursor

FETCH NEXT FROM user_Cursor INTo @username, @articleCount

WHILE @@FETCH_STATUS = 0

BEGIN

if exists(select 1 from users where username=@username)

begin

update users set articleCount=@articleCount where
username=@username

end

else

begin

insert into users(username, articleCount ) values(@username, @articleCount)

end

FETCH NEXT FROM user_Cursor INTo @username, @articleCount

END

CLOSE user_Cursor

DEALLOCATE user_Cursor

select * from users
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐