用游标进行的简单数据统计更新
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
有两个表:
用户表:
用户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
相关文章推荐
- 【ORACLE】一个简单实用的对数据进行行列转换并统计的SQL语句
- 利用游标进行简单的数据先进先出操作
- 关于使用游标更新数据和Case语句进行更新的实现过程
- 使用Enumerable模块实现简单的测试框架并进行数据统计
- 也许有用的SQL:对单表数据进行count统计生成简单的交叉表
- 【ORACLE】一个简单实用的对数据进行行列转换并统计的SQL语句
- Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计
- 【ORACLE】一个简单实用的对数据进行行列转换并统计的SQL语句
- 简单东西-group by与sum一起进行数据统计
- JDBC对数据进行插入,更新或者是删除之后得到修改或者插入的那条记录的主键值
- Android不同版本统计数据更新:Android 4.0份额为0.6%
- 在应用层调用OKhttp进行数据请求,更新View
- [C++]数据结构实验04:使用堆栈进行简单的四则运算
- mysql数据库数据改变监控 触发器 游标 new. old. java监控比对 最终是在后端java进行比对
- java读取文件数据进行一些简单处理的例子
- 对300万一张表数据,用游标进行循环,不同写法的效率比较
- SQL 游标使用的小例子,对于每行数据根据参数的不同进行Insert或Update操作.
- 使用postgreSQL DataSync 进行pg数据库升级 数据同步 升级脚本生成, postgreSQL DataSync简单教程
- 使用postgreSQL DataSync 进行pg数据库升级 数据同步 升级脚本生成, postgreSQL DataSync简单教程
- 使用postgreSQL DataSync 进行pg数据库升级 数据同步 升级脚本生成, postgreSQL DataSync简单教程