在sql server

时间:2016-01-27 20:12:19

标签: sql-server paging

我在这张桌子上工作:

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

使用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

两个查询的结果是:

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

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

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

1 个答案:

答案 0 :(得分:3)

问题在于您的订单是非确定性的。因为有很多行是Admin = 0,所以你不能保证每次都会选择相同的行。

如果您将查询更改为

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

然后你不会让同一行出现两次(假设[UserId]是唯一的)。

实际上,这仍然不能保证一行不会出现两次。如果在调用之间插入行,并且新行将出现在当前页面上,则当前页面上实际显示的某些行将在下一页上重新显示,因为它们已按顺序排列。