在 sql 服务器中分页时,按布尔列排序会产生重复行

Order by boolean column produce duplicate rows when paging in sql server

我正在研究这个 table :

使用IsAdmin列进行分页时,结果会出现重复的行。这是我的查询:

SELECT [UserId],[IsAdmin],[Date] FROM [Groups].[GroupMembers]
WHERE ([GroupId] = 5)
ORDER BY [IsAdmin] DESC
OFFSET 0 ROWS FETCH NEXT 6 ROWS ONLY 

第二个查询:

SELECT [UserId],[IsAdmin],[Date] FROM [Groups].[GroupMembers]
WHERE ([GroupId] =5)    
ORDER BY [IsAdmin] DESC
OFFSET 6 ROWS FETCH NEXT 6 ROWS ONLY

两次查询的结果是:

但是如果用户使用 Date 列,我得到的结果没有重复。

我的问题是为什么使用布尔值会产生重复的行?

问题是您的订单是 non-deterministic。由于有很多行的 Is Admin = 0,因此不能保证每次都会选择相同的行。

如果您将查询更改为

SELECT [UserId],[IsAdmin],[Date] FROM [Groups].[GroupMembers]
WHERE ([GroupId] = 5)
ORDER BY [IsAdmin] DESC, [UserId]

那么同一行就不会出现两次(假设 [UserId] 是唯一的)。

实际上,这仍然不能保证一行不会出现两次。如果在调用之间插入了行,并且新行会出现在当前页面上,那么当前页面上实际显示的一些行将在下一页上显示 re-shown,因为它们已经降低了顺序。