こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Selectした時のレコードの取得順

SQL Server2005 で開発しています。

Order by で並び替えてレコードをSelectする際に、
Order by の対象列データが同じ場合は、
どういった順番でレコードが取得できるのでしょうか?

TableA
No | Data1 | Data2
  1| AAA | 100
  2| AAA | 200
  3| AAA | 300
  4| ABC | 400
  5| BBB | 500
(Noはクラスタ化PK)

例えば、上のようなテーブルから次のSQLを実行すると
 (1)Select * From TableA ;
 (2)Select * From TableA Order by Data1 Asc;
 (3)Select * From TableA Order by Data1 Asc, No Asc;

 (1)(2)(3)全て、次の順で返ってきました。
  1| AAA | 100
  2| AAA | 200
  3| AAA | 300
  4| ABC | 400
  5| BBB | 500

 しかし、(2)のSQLは、データによって
 次の順で返ってくることがありました。
  3| AAA | 300
  1| AAA | 100
  2| AAA | 200
  4| ABC | 400
  5| BBB | 500
 
 1~3レコード目までは全てData1がAAAのレコードですが
 特に指定していなくても、No(PK)の順になるのかと思っていました。
 
 なお、レコードができた(Insert順)でもなさそうです。
 この、順番は何で決まっているのでしょうか?
 

投稿日時 - 2012-07-13 17:32:06

QNo.7588412

困ってます

質問者が選んだベストアンサー

>特に指定していなくても、No(PK)の順になるのかと思っていました。

下記のリンクに「ORDER BY 句が指定されていない限り、結果セットとして返される行の順序は保証されません。」と書いてあるので実際、保証されていないのだと思います。

http://msdn.microsoft.com/ja-jp/library/ms188385.aspx

で、実際にどういう順番で返ってくるのかはインデックスの種類(クラスタかどうかなど)や設定状況によって変わってくるのでケースバイケースだと思います。

投稿日時 - 2012-07-13 18:18:13

お礼

ありがとうございます。
リンク先の↓を見て、すっきりしました。

「ORDER BY 句が指定されていない限り、結果セットとして返される行の順序は保証されません。」

投稿日時 - 2012-07-13 18:54:17

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

ソートアルゴリズムを勉強すれば分かりますが、ほとんどのソートアルゴリズムはキーで指定された以外のデータ順については保障がありません。(安定的なソートではない)。
また、RDBMSが仮に安定的なソートアルゴリズムであっても、どのような順序にデータをフェッチするかはRDBMSの実装に依存しています。
> この、順番は何で決まっているのでしょうか?
きまりはないと思ってください。

投稿日時 - 2012-07-13 18:21:39

お礼

ありがとうございます。

投稿日時 - 2012-07-13 19:02:50

ANo.1

SQL Serverのローカルルールはよくわかりませんが
たいていのSQLではORDER BYで明示されていない場合は
表示順序は保障されない(つまり何順かわからない)
というのが原則だと思います

どうしても確定した表示が必要であれば、なんらかの
ユニークな属性のついたカラムでorder byしてやることです

投稿日時 - 2012-07-13 18:17:12

お礼

ありがとうございます。

投稿日時 - 2012-07-13 18:52:21

あなたにオススメの質問