MSSQL中ORDER BY结合OFFSET和FETCH NEXT出现重复记录问题
解决单列重复值排序导致的分页重复问题
当排序列(如dob)存在重复值时,数据库对这些重复值记录的排序是不稳定的——每次查询时它们的相对顺序可能随机变化,进而导致分页操作中同一条记录出现在不同页码的结果里。
要解决这个问题,即使要求主要按存在重复值的单列排序,也可以在ORDER BY子句中追加一个唯一标识列(例如你的id列)作为辅助排序条件。唯一列能为重复排序值的记录提供固定的排序依据,确保每次查询时这些记录的相对顺序完全一致,彻底避免分页重复。
修改后的分页查询示例
第一页(前10条记录)
SELECT [id] ,[name] ,[dob] FROM [Production].[dbo].[test] ORDER BY [dob] ASC, [id] ASC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
第二页(接下来10条记录)
SELECT [id] ,[name] ,[dob] FROM [Production].[dbo].[test] ORDER BY [dob] ASC, [id] ASC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
这里利用id的唯一性,让相同dob的记录始终按id升序排列,数据库每次执行分页查询时,这些记录的位置都会固定,不会出现跨页重复或遗漏的情况。
内容的提问来源于stack exchange,提问作者DevMaster
相关产品推荐
相关产品推荐

