私はSQLServer2008を使用しており、永続層として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が最初のページで結果を取得するために生成するもの)を省略すると、結果に2つのまったく異なるテーブルエントリが表示されます。
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
これは私を完全に混乱させ、アプリのバグにつながり、検索の最初のページと2番目のページの最初の要素と同じCampsiteエントリを取得します。
同じORDERBY句がROW_NUMBEROVER()式内で異なる動作をするのはなぜですか?