我在SQL Server 2008上,使用NHibernate作为持久层(尽管这个问题纯粹是SQL,我相信)。为什么ROW_NUMBER OVER(ORDER BY列)返回的结果顺序与ORDER BY列不同?
我归结我的问题下面的SQL语句:
SELECT TOP 2
this_.Id as Id36_0_,
this_.Name as Name36_0_,
ROW_NUMBER() OVER (ORDER BY this_.IsActive) as MyOrder
FROM Campsites this_
ORDER BY this_.IsActive /* a bit field */
这是NH产生检索分页查询结果集的一部分。上面的语句给我了以下结果:
Id36_0_ Name36_0_ MyOrder
9806 Camping A Cassagnau 1
8869 Camping a la ferme La Bergamotte 2
但是,如果我忽略OVER(ORDER BY this_.IsActive)的ROW_NUMBER() - 这正是NH生成的第一页上检索结果 - 我得到两个在我的结果完全不同的表项:
SELECT TOP 2
this_.Id as Id36_0_,
this_.Name as Name36_0_
/* ROW_NUMBER() OVER(ORDER BY this_.IsActive) as MyOrder */
FROM Campsites this_
ORDER BY this_.IsActive /* a bit field */
回报
Id36_0_ Name36_0_
22876 Centro Vacanze Pra delle Torri
22135 Molecaten Park Napoleon Hoeve
这完全混淆了我,并导致我们的应用程序中的错误,我会得到相同的营地项作为第一个元素在我们搜索的第一页和第二页。
为什么相同的ORDER BY子句在ROW_NUMBER OVER()表达式中以不同的方式工作?
很奇怪,因为对于2005方言,row_number列总是被命名为'__hibernate_sort_row',并且顺序总是使用该列。 – dotjoe 2010-06-01 20:50:16