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()表达式中的工作方式不同?
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)
| 归档时间: |
|
| 查看次数: |
3850 次 |
| 最近记录: |