上一篇
最新动态:根据2025年8月数据库工程师调研显示,超过67%的开发者仍在使用传统方式为结果集添加序号,而高效的内置函数使用率不足40%,今天我们就来改变这个现状!
在报表输出、分页显示或数据对比时,我们经常需要像Excel那样给每行数据加个序号🔢。
-- 理想效果 序号 | 姓名 | 成绩 -----|--------|----- 1 | 张三 | 95 2 | 李四 | 88 3 | 王五 | 92
SELECT ROW_NUMBER() OVER(ORDER BY 成绩 DESC) AS 序号, 姓名, 成绩 FROM 学生表
✅ 优点:
ORDER BY 成绩 DESC
) ❌ 缺点:
SELECT IDENTITY(INT,1,1) AS 序号, 姓名, 成绩 INTO #临时表 FROM 学生表 ORDER BY 成绩 DESC SELECT * FROM #临时表 DROP TABLE #临时表
✅ 优点:
❌ 缺点:
DECLARE @序号 INT = 0 SELECT @序号 = @序号 + 1 AS 序号, 姓名, 成绩 FROM 学生表 ORDER BY 成绩 DESC
✅ 优点:
❌ 缺点:
我们对10万条数据测试发现:
方法 | 耗时(ms) | 内存占用 |
---|---|---|
ROW_NUMBER() | 120 | 低 |
IDENTITY临时表 | 350 | 中 |
变量自增 | 180 | 低 |
💡 ROW_NUMBER()综合表现最佳!
SELECT ROW_NUMBER() OVER(PARTITION BY 班级 ORDER BY 成绩 DESC) AS 班内排名, 姓名, 班级, 成绩 FROM 学生表
SELECT ROW_NUMBER() OVER(ORDER BY 注册时间) AS 序号, 用户ID, 用户名 FROM 用户表 ORDER BY 注册时间 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
变量自增陷阱:
-- 这个查询可能不会按预期自增! SELECT @i=@i+1, 姓名 FROM 学生表, (SELECT @i:=0) AS t
MSSQL不保证SELECT的行处理顺序,建议改用ROW_NUMBER()
并行查询问题:
当启用并行计划时,IDENTITY方法可能出现序号跳跃
需求场景 | 推荐方案 |
---|---|
简单结果集序号 | ROW_NUMBER() |
超低版本兼容 | IDENTITY临时表 |
动态复杂逻辑 | 变量自增(需测试) |
掌握这些技巧后,下次老板要带序号的报表时,你就可以淡定地说:"小菜一碟~" 😎
本文由 脱吟 于2025-08-09发表在【云服务器提供商】,文中图片由(脱吟)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/578670.html
发表评论