日期:2014-05-18  浏览次数:20538 次

谁能帮我把这个游标优化下
declare @username1 nvarchar(50),@uermoney1 int //定义下用户名
declare uname cursor for select username,uermoney from users //从用户表查用户名和金额放到游标里
open uname
fetch next from uname into @username1,@uermoney1 //把游标查询放到两个变量里
while @@FETCH_STATUS=0
begin
select @username1,@uermoney1,b_after from bank_back where @uermoney1<>
(select (select sum(back_money2)-sum(back_money) from bank_back where username=@username1 and addtime>'11-11-1 17:47'
and follows not like '%hedui%' and follows not like '修改资金')+(select top 1 b_after from bank_back where username=@username1 and addtime<'11-11-1 17:47' order by addtime desc)
//这个是计算他应当有的资金. 就是从<>到这个括号这边,这个不用去改,也不用管怎样算的。
)//这个查询就是要比对用户表里的资金跟他应当有的资金是否一致,如果不一致则查出来。

fetch next from uname into @username1,@uermoney1
end
close unamen
deallocate uname

我期待的结果是,在一张临时表里,有三个列,用户名和用户资金和他实际应当的资金。然后如果用户资金和他实际资金不一致则列出来。但是我查询出来结果是
0 行受影响)
...
...
...
...
(0 行受影响)

(0 行受影响)

(202605 行受影响)

(202605 行受影响)

(0 行受影响)

...
(0 行受影响)


------解决方案--------------------
中間這段這樣改試試

SQL code
select @username1,@uermoney1,b_after 
from bank_back  AS a
    INNER JOIN (select top 1 b_after from bank_back where username=@username1 and addtime<'11-11-1 17:47' order by addtime desc) AS b ON a.username=b.username
    INNER JOIN (select sum(back_money2)-sum(back_money) AS back_money from bank_back where username=@username1 and addtime>'11-11-1 17:47' and follows not like '%hedui%' and follows not like '修改资金') AS c ON c.username=a.username
WHERE b.b_after <>@uermoney1-c.back_money

------解决方案--------------------
直接查询不行吗

SQL code
select a.username,a.uermoney1,b.b_after 
from users  a,bank_back b 
where a.username=b.username
and uermoney1<>
(select (select sum(back_money2)-sum(back_money) from bank_back where username=b.username1 and addtime>'11-11-1 17:47'
and follows not like '%hedui%' and follows not like '修改资金')+(select top 1 b_after from bank_back where username=b.username1 and addtime<'11-11-1 17:47' order by addtime desc)