できません。リレーショナル データベースには、テーブル内の行を並べ替えるという概念がありません。順序付けられた出力が必要な場合は、ORDER BY
句を使用する必要があります。これは基本的な事実であり、回避できるものではありません。
SQL Server 2000 では、(本質的に) エラーで、Microsoft はビューにORDER BY
句を含めることを許可しましたが、これにより出力が順序付けられました。ただし、SQL Server 2005 では、そのように操作することは決して正しくないため、これが変更されました。
このトリックを試すこともできますがSELECT TOP (2147483647) * FROM dbo.Blah B ORDER BY B.Col;
、SQL Server の新しいバージョンでもうまくいきません。の順序付け動作はTOP
、主な効果ではなく副次的な効果であり、ビューで依存するべきではありません。それを正しく行い、並べ替えを本来あるべき場所に配置します。つまり、プレゼンテーション層またはデータベースに送信される最終的な外部クエリ (ala SELECT Columns FROM dbo.View ORDER BY X;
) です。
テーブル内の行を順序付けしないことについてもう少し: はい、クラスター化されたインデックスがありますが、いくつかの理由で順序付けられたデータを返すことに依存することはできません:
- 非クラスター化インデックスを使用してクエリを満たすことができるため、クラスター化インデックスの順序は出力行セットの順序に影響しません。
- テーブルにクラスター化インデックスがまったくない場合があります。
- 各クラスター化インデックス ページの行は、次のページよりも小さく、前のページよりも大きくなっていますが、各ページ内の行自体は順序付けされていません。
- 1 つのストリームが他のストリームよりも高速または低速で返される可能性があるため、並列処理によって行が生成される順序が変わる可能性があります。
- クエリの実行中に、別のプロセスが現在のクエリを満たす行の一部を既に読み取っている場合、読み取りを保存するために現在のクエリにそのデータが順不同で借用される場合があります (その後、現在のクエリは残りの行のみをフェッチします)。ありません)。
順序付けされた行セットを取得するには、簡単で信頼性が高く、必須ORDER BY
の方法が 1 つあります。