5

クエリで使用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 

理由を確認しようとすると、2番目のクエリが100より大きいRN値を返すことがわかります。これは1から始まりません。

誰かがこの振る舞いの考えられる理由を説明できますか?row_number()構文に変更するものはありますか、または関数値を1から開始するためにSQL Serverで変更する設定はありますか?

4

1 に答える 1

11

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

各パーティションの最初の行を 1 として、結果セットのパーティション内の行の連続番号を返します。

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

于 2011-11-16T06:08:53.423 に答える