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

来源:互联网 发布:c语言模块化 编辑:程序博客网 时间:2024/04/29 12:06

下面是在设计系统时需要解决的一个问题:

有两个表:
用户表:
      用户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 whereusername=@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