web-dev-qa-db-ja.com

ビューのORDER BY句がWHERE句で呼び出されるとすぐに無視されるのはなぜですか?

頻繁に呼び出されるクエリを単純化するために、いくつかのテーブルを結合するビューがあります。このビューには、計算フィールドにORDER BY句があります(順序が変わることはありません)。 (SQL Server Express 2008 R2)。

基本的な考え方は次のとおりです(簡略化):

SELECT [EventType].Name, 
    [EventType].TotalOccurrences, 
    [Session].ID, 
    [Session].TotalOccurrences, 
    [Session].TotalOccurrences / [EventType].TotalOccurrences AS saturation
FROM [EventType]
    INNER JOIN [Session] ON [EventType].ID = [Session].Event
ORDER BY saturation

ただし、このビューはwhere句なしでは呼び出されません(私の場合、データベース全体が返されます)。常にWHERE [EventType].ID = xが付きます。ただし、where句を追加するとすぐに、ORDER BY句は無視されます。 where句がなければ、期待どおりに動作しています。

実際には別の質問ですが、私がここにいる間にここに投げ込みます。そのような情報を取得するより良い方法はありますか? [EventType].Name[EventType].TotalOccurrencesは、返されたすべての行で同一になります。これは、ネットワーク帯域幅の小さなウエストです。それは問題ではありませんが、データベースへの複数のラウンドトリップの待ち時間のオーバーヘッドなしでそれに対処するために何かが存在するのだろうかと思いますか?

[編集]上記のサンプルは過度に単純化されており、計算フィールドには他の要因があるため、この例のように単にORDER BY [Session].TotalOccurrencesとは異なる順序が返されますが、原理は明確です。

[編集2]その答えから、グラフィックデザイナには基礎となるデータベースよりも多くの機能があるという結論に達しました。

Bugus features in SSMS

4
Louis Somers

投稿したクエリはビューの作成には無効​​です。このクエリに対して_CREATE VIEW xy AS_を実行すると、エラーが発生します。 TOP句を使用していますか?

テーブル式(セット)であるビューは、順序を定義できません。これは、リレーショナルモデルの原則に反するためです(リレーショナルテーブルの行には順序がないため、セットは順序付けられていないコレクションです)タプル)。同じことが他のテーブル式にも当てはまります-派生テーブル、CTEなど.

BOL記事 から_ORDER BY_句について:

TOP、OFFSET、およびFETCH句も指定されていない限り、ビュー、インライン関数、派生テーブル、およびサブクエリでは、ORDER BY句は無効です。これらのオブジェクトでORDER BYを使用すると、TOP-句またはOFFSET句とFETCH句によって、句は返される行を決定するためにのみ使用されますになります。 ORDER BY句しない保証された順序付けされた結果クエリ自体でORDER BYも指定されていない限り、これらの構成がクエリされたとき。

短い話:ビューを参照する外部クエリで_ORDER BY_句を使用します。ビューでは使用しないでください。 TOP(100) PERCENT(またはSQL Server 2012では、_OFFSET-FETCH_と同等)を使用しても、表示順序は保証されず、行の上位100%が任意の順序で取得されることを意味します。

10