在 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,因为它们已经降低了顺序。
我正在研究这个 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,因为它们已经降低了顺序。