47

次のスクリプトの結果セットが常にこの ORDER のようにソートされると確信できますか?

SELECT 'O'
UNION ALL
SELECT 'R'
UNION ALL
SELECT 'D'
UNION ALL
SELECT 'E'
UNION ALL
SELECT 'R'

場合によっては順序が異なることを証明できますか?

4

4 に答える 4

54

固有の順序はありません。使用する必要がありますORDER BY。あなたの例ではSortOrder、各 SELECT に a を追加することでこれを簡単に行うことができます。これにより、レコードが必要な順序で保持されます。

SELECT 'O', 1 SortOrder
UNION ALL
SELECT 'R', 2
UNION ALL
SELECT 'D', 3
UNION ALL
SELECT 'E', 4
UNION ALL
SELECT 'R', 5
ORDER BY SortOrder

クエリで order by を具体的に指定しない限り、順序を保証することはできません。

于 2013-04-02T14:15:13.437 に答える
40

いいえ、違います。SQL テーブルは本質的に順不同です。order by必要な順序で物事を取得するために使用する必要があります。

問題は、一度試してみてうまくいくかどうかではありません。問題は、この動作を信頼できるかどうかです。そして、あなたはできません。SQL Server は、これの順序さえ保証しません。

select *
from (select t.*
      from t
      order by col1
     ) t

それはここに言います:

ビュー、インライン関数、派生テーブル、またはサブクエリの定義で ORDER BY が使用されている場合、句は TOP 句によって返される行を決定するためにのみ使用されます。ORDER BY 句は、クエリ自体で ORDER BY も指定されていない限り、これらの構造がクエリされたときに順序付けられた結果を保証しません。

SQL 言語の基本原則は、テーブルが順序付けられていないことです。そのため、クエリは多くのデータベースで機能する可能性がありますが、結果の順序を保証するには、BlueFeet が提案するバージョンを使用する必要があります。

于 2013-04-02T14:13:00.423 に答える
16

ALLたとえば、すべての を削除してみてください。またはそれらの1つだけでも。SELECTここで、クエリがテーブルに対する実際のクエリであり、個別に最適化されている場合に、そこで発生する必要がある最適化のタイプ (および他の多くのタイプ) も可能であると考えてください。がないとORDER BY、各クエリ内の順序は任意になり、クエリ自体が任意の順序で処理されることを保証できません。

UNION ALLノーと言うのORDER BYは、「ビー玉を全部床に投げろ」と言っているようなものです。床にすべてのビー玉を投げるたびに、ビー玉が色ごとに整理されることがあります。これは、次に床に投げたときに同じように振る舞うという意味ではありません。同じことが SQL Server での順序付けにも当てはまります。指定しない場合、ORDER BYSQL Server は順序を気にしないと見なします。たまたま特定の順序が常に返されていることに気付くかもしれませんが、多くのことが次に選択された任意の順序に影響を与える可能性があります。データの変更、統計の変更、再コンパイル、計画のフラッシュ、アップグレード、サービス パック、修正プログラム、トレース フラグ... うんざりです。

わかりやすくするために、これを大きな文字で示します。

ORDER BY なしで注文を保証することはできません

さらに読む:

また、SQL チームの優秀な人物である Conor Cunningham によるこの投稿もお読みください

于 2013-04-02T14:28:18.237 に答える
6

いいえ。SQL Server がレコードをフェッチする方法でレコードを取得します。次のように、1 から始まるインデックスによって結合された結果セットに順序を適用できます。

SELECT 1, 'O'
UNION ALL
SELECT 2, 'R'
UNION ALL
SELECT 3, 'D'
UNION ALL
SELECT 4, 'E'
UNION ALL
SELECT 5, 'R'
ORDER BY 1
于 2013-04-02T14:14:27.573 に答える