高分请问,一个sql语句的有关问题
高分请教,一个sql语句的问题
有表如下
userid count useFlag
1 20 0
2 10 1
1 2 1
1 35 0
2 6 0
3 3 1
需求:
1、筛选 userid= @userid,且useFlag为0的记录前N条记录,计算出count总和,同时把这些记录的useFlag设为0
2、如果中途出错,则回滚
另外的问题:
select 会影响@@ERROR吗?
------解决思路----------------------
2008+可以直接
update top (N) tablename set ...
where ...
useFlag为0的记录.............................useFlag设为0
是否笔误
select 会影响@@ERROR
------解决思路----------------------
declare @userid int
declare @n int
set @userid=1
set @n=10
select sum([count]) from (
select top(@n) * from tablename where userid= @userid and useFlag='0'
) as a
这些记录的userFlag都是0还怎么更新为‘0’
------解决思路----------------------
这个是可以更新的,再加一个更新语句。只不过你是按什么字段排序的,不同字段排序,查询的前多少条的数据是不一样的。
------解决思路----------------------
得分两次写~
另外,如reenjie TOP需要依据一定的排序, 否则你每次执行都可能结果都不一样~
------解决思路----------------------
------解决思路----------------------
"筛选 userid= @userid,且useFlag为0的记录前N条记录"
--> 请问前N条记录的排序规则是什么?
------解决思路----------------------
以ID排序為例
有表如下
userid count useFlag
1 20 0
2 10 1
1 2 1
1 35 0
2 6 0
3 3 1
需求:
1、筛选 userid= @userid,且useFlag为0的记录前N条记录,计算出count总和,同时把这些记录的useFlag设为0
2、如果中途出错,则回滚
另外的问题:
select 会影响@@ERROR吗?
------解决思路----------------------
2008+可以直接
update top (N) tablename set ...
where ...
useFlag为0的记录.............................useFlag设为0
是否笔误
select 会影响@@ERROR
------解决思路----------------------
declare @userid int
declare @n int
set @userid=1
set @n=10
select sum([count]) from (
select top(@n) * from tablename where userid= @userid and useFlag='0'
) as a
这些记录的userFlag都是0还怎么更新为‘0’
------解决思路----------------------
这个是可以更新的,再加一个更新语句。只不过你是按什么字段排序的,不同字段排序,查询的前多少条的数据是不一样的。
------解决思路----------------------
declare @userid int
declare @n int
set @userid=1
set @n=10
select sum([count]) from (
select top(@n) * from tablename where userid= @userid and useFlag='0'
) as a
这些记录的userFlag都是0还怎么更新为‘0’
应该是更新为1,写错了
这个是可以更新的,再加一个更新语句。只不过你是按什么字段排序的,不同字段排序,查询的前多少条的数据是不一样的。
更新加求和功能的完整语句怎么写呢?
得分两次写~
另外,如reenjie TOP需要依据一定的排序, 否则你每次执行都可能结果都不一样~
------解决思路----------------------
试试这个
declare @userid int=1, @n int=1,@sum int,@sql varchar(max)
begin tran
;with cte as
( select count,useflag from (select top (@n) * from tt
where userid=@userid and useflag!=0
order by count) as t)
select @sum=SUM(count) from cte
print @sum
update top (@n) tt
set useflag =1
where userid=1 and useflag=0
end
------解决思路----------------------
"筛选 userid= @userid,且useFlag为0的记录前N条记录"
--> 请问前N条记录的排序规则是什么?
------解决思路----------------------
"筛选 userid= @userid,且useFlag为0的记录前N条记录"
--> 请问前N条记录的排序规则是什么?
数据库还有一个插入时间、一个bigint的自增长ID,可以按时间排序,也可以按自增长ID排序,都可以
1、统计数据
2、统计后把useFlag置为1
以ID排序為例
declare @userid int
declare @n int
set @userid=1
set @n=10
select sum([count]) from (
select top(@n) * from tablename where userid= @userid and useFlag='0' order by ID
) as a
update tablename set useFlag='1' where ID in (select top(@n) ID from tablename where userid= @userid and useFlag='0' order by ID)