SqlServer临时表和游标循环遍历数据表方法实例
2024-07-05
61
最近有个需求,有包含用户Id的表Users,包含通话记录的表MobileCalls,现在要查询表Users中某些用户联系过的通话次数最多的5个人的手机号结果集。
所以考虑了一下要使用临时表和游标。
用游标遍历表Users,根据表Users的用户Id去MobileCalls中groupby出手机号和通话次数取top5插入到临时表最后再查询临时表得到最终结果集。
实现SQL语句如下:
if object_id('tempdb..#Temp0809') is not null Begin
drop table #Temp0809--如果存在该临时表则删掉
End
CREATE TABLE #Temp0809
(
Mobile nvarchar(50)--创建临时表
)
--定义变量,用于存储当前被遍历到的值
declare @a bigint;
--递归,首先需要递归的空间,定义一个游标指向这个空间
declare mycursor cursor for select UserId from A where ... order by id asc
--打开游标
open mycursor
--开始遍历,将下一行的数据存入两个变量中
fetch next from mycursor into @a
while (@@fetch_status=0)--如果下一行还有数据
begin--开始遍历
insert into #Temp0809(Mobile) SELECT TOP 5 Mobile
FROM MobileCalls WITH(NOLOCK)
WHERE UserId = @a
GROUP BY Mobile ORDER BY SUM(Duration) DESC
fetch next from mycursor into @a--再下一行
end--遍历结构结束
close mycursor--关闭游标
deallocate mycursor--删除游标
--遍历完成
select * from #Temp0809--查询结果集
drop table #Temp0809--删除临时表
每个语句的意思都写在注释里了,可以参考一下。如果有更好的办法,请留言谢谢。
赞一波!
相关文章
- SqlServer数据库自增标识种子当前值设置
- sql创建并循环临时表
- SQLServer数据库基础面试题
- SQLServer 锁表查询命令
- SQLServer nolock查询防止锁表
- SqlServer分页查询示例
- SQLServer修改服务端口号
- SQLServer分页查询语句
- SQLServer DATEDIFF用法和性能
- SQLServer如何查询死锁和防止死锁
- MySQL和SQLServer哪个性能更好?
- .NET EntityFramework Core 8 搭配SQLServer哪个版本最好?
- SQLServer2019关闭密码自动过期时间设置
- MySQL SQLServer Oracle数据库的区别
文章评论
评论问答