为什么ROW_NUMBER OVER(ORDER BY列)返回的结果顺序不仅仅是ORDER BY列?

Oli*_*ver 3 t-sql nhibernate row-number sql-order-by sql-server-2008

我在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 */
Run Code Online (Sandbox Code Playgroud)

这是NH为检索分页结果集而生成的查询的一部分.以上陈述给出了以下结果:

Id36_0_ Name36_0_                       MyOrder
9806    Camping A Cassagnau                 1
8869    Camping a la ferme La Bergamotte    2
Run Code Online (Sandbox Code Playgroud)

但是,如果我省略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 */
Run Code Online (Sandbox Code Playgroud)

回报

Id36_0_ Name36_0_
22876   Centro Vacanze Pra delle Torri
22135   Molecaten Park Napoleon Hoeve
Run Code Online (Sandbox Code Playgroud)

这完全让我感到困惑,并导致我们的应用程序中的一个错误,我获得相同的Campsite条目作为我们搜索的第一页和第二页的第一个元素.

为什么相同的ORDER BY子句在ROW_NUMBER OVER()表达式中的工作方式不同?

SQL*_*ace 5

ORDER BY this_.IsActive/*有点字段*/

因为那是一个位字段,它只能是0或1 ...我假设你有很多行,这个位字段为0或1排序它没有意义,如果90%是活跃的...你在这种情况下,你没有真正订购,因为你没有第二次订购.

你为什么不挑选一些独特的东西...也许是his_.Name

或者这个怎​​么样?

ROW_NUMBER() OVER (ORDER BY this_.IsActive, this_.Name) 
Run Code Online (Sandbox Code Playgroud)