如何在SELECT查询中生成无需分组排序的序列号(替代ROW_NUMBER())
为查询结果生成无排序的序列号
嘿,其实你完全可以继续用ROW_NUMBER(),只是需要给OVER子句加个小技巧就行!很多数据库(比如SQL Server)要求ROW_NUMBER()必须搭配ORDER BY,但你可以用一个不会触发实际排序的表达式,这样既满足语法要求,又不会改变你的结果顺序,也不需要额外分组。
最推荐的方案是用ORDER BY (SELECT NULL),数据库会识别这是一个常量表达式,不会做额外的排序操作,直接按数据读取的默认顺序生成序列号:
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ArrayId , TRIM(CM.Category) as Category , TRIM(CM.SubCategory) as SubCategory , CM.PlantCode , ISNULL(PM.PlantName,'') as PlantName , CM.Capacity AS Capacity_ , CM.SizeRange , CM.CapacityId FROM capacitymaster2 CM LEFT JOIN PlantMaster2 PM ON CM.PlantCode = PM.PlantCode WHERE CM.SubCategory IS NOT NULL AND CM.SubCategory != ''
如果你的SQL Server版本支持,也可以用ORDER BY @@ROWCOUNT替代,效果是一样的——本质都是告诉数据库不需要排序,直接生成序号。
另外还有一种可选方案是用变量累加,适合一些版本较低的SQL Server:
DECLARE @SeqNum INT = 0; SELECT @SeqNum = @SeqNum + 1 AS ArrayId , TRIM(CM.Category) as Category , TRIM(CM.SubCategory) as SubCategory , CM.PlantCode , ISNULL(PM.PlantName,'') as PlantName , CM.Capacity AS Capacity_ , CM.SizeRange , CM.CapacityId FROM capacitymaster2 CM LEFT JOIN PlantMaster2 PM ON CM.PlantCode = PM.PlantCode WHERE CM.SubCategory IS NOT NULL AND CM.SubCategory != ''
不过要注意,这种变量累加的方法在并行查询计划下可能会出现序号不连续的问题,所以优先推荐第一种ROW_NUMBER()的方案,它更稳定可靠。
如果是其他数据库(比如MySQL 8.0+),直接用ROW_NUMBER() OVER ()就可以,不需要额外的ORDER BY子句。
内容的提问来源于stack exchange,提问作者Baba Ranjith
相关产品推荐
相关产品推荐

