2011-11-16 10 views
4

私たちの質問にはROW_NUMBER()が使用されています。ほとんどのシナリオで正しい結果が返されています。しかし、1人のユーザーにとって、これは非常に異なった動作をしています。SQL Server ROW_NUMBER()がどのシナリオで1から開始しないのですか?

With #TEST as (
    select top 50 
     ROW_NUMBER() over (order by a.ID) as RN, 
     a.ID ID, a.Name Name 
    FROM a 
    where a.name like '%test%') 
select * 
from #TEST 
where RN BETWEEN 1 AND 50 
order by RN 

ページ・サイズが50に設定されている場合は、このクエリは、そのユーザーのために正常に動作している。しかし、ページサイズが100に設定されている場合、我々はそれがすべての行を返していないことを確認します。それはちょうど10行だけを返しています。条件を満たす100以上の結果があるにもかかわらず、以下のクエリが正しく動作していないことを確認してください。理由を検証しようとすると

With #TEST as (
    select top 100 
     ROW_NUMBER() over (order by a.ID) as RN, 
     a.ID ID, a.Name Name 
    FROM a 
    where a.name like '%test%') 
select * 
from #TEST 
where RN BETWEEN 1 AND 100 
order by RN 

、我々は第二のクエリはRNは、いくつかのいずれかが、この動作の可能性の理由を説明することができますそれは1

から起動しない100以上の値を返すことを確認します。構文に何か変更がありますか、またはrow_number()関数の値が1から始まるようにSQL Serverで変更する設定がありますか?

+5

コメント:私はCTEを '#'で始まるいくつかの名前で呼び出すことはしません - その文字は 'TempDB'に保存された**一時テーブル**を意味します....他の名前を使用する –

答えて

9

row_numberは常に1から始まります。

各パーティション内の最初の行の1から始まり、結果 組のパーティション内の行の順序番号を返します。

select topはorder by節なしで実行しています。つまり、返される行を制御することはできません。異なる索引を使用して行を取得する実行計画が異なる可能性があります。ある計画の上位100行は別の計画の上位100行ではありません。 CTEのクエリに関連する順序を追加するか、またはメインクエリの行をとにかくフィルタリングしているため、上部の句を削除できます。

関連する問題