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

标签 nhibernate tsql sql-server-2008 sql-order-by row-number

我在 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() 表达式中的工作方式不同?

最佳答案

ORDER BY this_.IsActive/* 一个位域 */

因为这是一个位域,所以它只能是 0 或 1...我假设你有很多行,这个位域是 0 或 1,按它排序是没有意义的,如果 90% 处于事件状态怎么办...你在这种情况下没有真正正确订购,因为您没有第二次订购。

你为什么不选择一些独特的东西......例如他的_.Name

或者这个怎​​么办?

ROW_NUMBER() OVER (ORDER BY this_.IsActive, this_.Name) 

关于nhibernate - 为什么 ROW_NUMBER OVER(ORDER BY 列)返回的结果顺序与仅 ORDER BY 列不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2952549/

相关文章:

NHibernate/FluentNHibernate 属性包

c# - 使用 NHibernate 实现全局化

nhibernate - 使用 Fluent Nhibernate 映射带有参数的 nhibernate 自定义类型

sql - 如何授予自己对本地 SQL Server 实例的管理员访问权限?

c# - 映射实体无法完成,因为它找不到属性

sql-server - 查询 where date = '2016/01/02' 不工作?

SQL Server 乐观锁定 - 返回更改的时间戳值

sql - 将存储为 VARCHAR 的 BINARY 转换为 BINARY

sql - sql server中有2个相同排名的学生的分数计算

sql-server - T-SQL : pass an array of ids to a stored procedures