2016-05-12 11 views
3

現在SQL Server 2014 Professionalを使用していますが、現在のバージョンは(12.0.4100)です。ビューがあり、特定のオフセットで10行をSELECTしようとしています。
私のビューは以下のようなものです:SQL Server 2014 ORDER BY句とOFFSET FETCH NEXTは奇妙な結果を返します

BeginTime |  EndTime | Duration | Name 
09:00:00.0000000|16:00:00.0000000| 1  | some_name1 
09:00:00.0000000|16:00:00.0000000| 2  | some_name2 
09:00:00.0000000|16:00:00.0000000| 3  | some_name3 
09:00:00.0000000|16:00:00.0000000| 4  | some_name4 
09:00:00.0000000|16:00:00.0000000| 5  | some_name5 
09:00:00.0000000|16:00:00.0000000| 6  | some_name6 
09:00:00.0000000|16:00:00.0000000| 7  | some_name7 

これらおよびすべてのBeginTimeEndTimeでまったく同じ値を持つように100行があります。関連する表の期間は1から100まで増分されます。
クエリが唯一の場合:

SELECT * FROM View_Name 

結果セットは正しいです。期間の列を調べることでわかります。

0から始まる10行だけをフェッチしたい場合、ResultSetは正しいものであり、最大18まで開始することが正しいです。19から始まったり10以上の行をフェッチしたい場合、ResultSetのDurationは無関係な結果を返しますDurationのように逆転した。しかし、それは次のように、私は特定の行をフェッチするために使用されるクエリである以上11 よりも持続時間を有する行を返すことはありません:

SELECT * FROM View_Name ORDER BY BeginTime ASC OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY 

このような状況では奇妙な何かがもあります。 USE masterと指定するとこの問題は解消されますが、USE [mydb_name]と指定した場合は、問題が再び表示されます。
ところで、私は自分のローカルPCでSQL Server 2014 Professional v(12.0.2269)を使用していますが、この問題は上記の状況では消えます。

PS:私はUSE masterを使用できません。なぜなら、ビューを動的に作成し、ストアドプロシージャにリストするからです。
ヘルプ、解答、またはコメントを受け付けます。
ありがとう!

答えて

0

あなたの注文は一意でなければなりません。そうでなければ、非確定的な結果が得られます(あなたの場合、開始時刻は一意ではなく、毎回同じ結果が得られるとは限りません)。 ..

SELECT * FROM View_Name ORDER BY duration OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY 

あなたがで外側の順序を持​​っていない限り、結果セットが毎回正確であることが保証されていません(ビューから選択*)、あなたの最初のクエリを追加することにあります。

+0

おかげで、私はあなたが慎重に質問をお読みたいです。 –

+0

正しいものと正しいものではないことを明確にしてください。私は最初のクエリで正しい結果を得ていると仮定しています(あなたが外注をしていない限りは保証されません)。オフセットとフェッチで同じ結果を得られません。 – TheGameiswar

+0

'SELECT * FROM View_Name ORDER BY BeginTime ASC'は正しい順序を返します!あなたの注意のために。 –

7

documentationは説明する:

OFFSETFETCHを使用してクエリ要求間の安定した結果を達成するために、以下の条件を満たしている必要があります

。 。 。

  1. ORDER BY句には、一意であることが保証されている列または列の組み合わせが含まれています。あなたのケースで何が起こる

BeginTimeが一意ではないということです。一般的なデータベース(特にSQL Server)は、安定したソートを実装していません。安定した並べ替えは、キーが同じ場合に行が同じ順序になるソートです。テーブルと結果セットは順序付けられていないセットを表すため、これはむしろ明らかです。それらには固有の順序がありません。

ソートを安定させるには、一意のキーが必要です。あなたのデータを考えると、これはdurationname、またはその両方のいずれかのように見えるでしょう:応答のための

SELECT * 
ROM View_Name 
ORDER BY BeginTime ASC, Duration, Name 
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY; 
+0

リノフ氏に感謝しています。リノフ氏は役に立ちました。非常にうまくいきました。しかし、ビュー内にユニークな列がない場合はどうなりますか?ビューは、私のWebアプリケーションで動的に表示されます。そしてまた、マスターを使用しているときにこの問題がなぜ消えますか? –

+0

@AlicanUzun。 。 。クエリが機能していると思われるだけで、一貫して動作するわけではありません。 –

関連する問題