我在 SQL Server 2008 上,使用 NHibernate 作为持久层(尽管我相信这个问题纯粹是 SQL)。
我将问题归结为以下 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
但是,如果我省略 ROW_NUMBER() OVER (ORDER BY this_.IsActive) - 这是 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
这完全让我感到困惑,并导致我们的应用程序出现错误,在该错误中,我得到与搜索的第一页和第二页上的第一个元素相同的 Campsite 条目。
为什么相同的 ORDER BY 子句在 ROW_NUMBER OVER() 表达式中的工作方式不同?