ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3394901 order by区の記述位置
質問者:mom889 以下のようなsqlを書いた場合、
(入れ子になった内側でorderbyを記述している)
6行目に書いたorderbyの動作(ソートキーの降順に並ぶこと)は
oracle,sql server等、各環境で保障されるのでしょうか?
以下の例ではうまく動作していたのですが(oracle)
入れ子が多くなった場合もうまくうごくのでしょうか?
--------------------
select a.* from
(
  select a.ソートキー from テーブル a
  union all
  select a.ソートキー from テーブル b
  order by ソートキー desc
) a
--------------------

自分は、order by は最後に書くものだと思っていたのですが、
たまたま上記のような入れ子になった内側でソートしているソースを見ることがあり
みなさんにお話をうかがいたく質問させていただきました。
よろしくお願いいたします。
困り度:
  • 困っています
質問投稿日時:
07/10/02 14:08
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.3 >oracle,sql server等、各環境で保障されるのでしょうか?

ORDER-BYを外側に書かない限り、RDBMSとしては出力順を保証する必要がありません。
RDBMSの処理上、結果的にORDER-BYを書いたときと同じ結果になります。
(ORCALEもSQLserverも、現行バージョンまでなら結果オーライ)

>入れ子が多くなった場合もうまくうごくのでしょうか?

基本的に問題ありません。


サブクエリの中で、order指定をするのは、データを加工する時に、加工する順番に意味がある場合で、
問い合わせ全体の出力順を決めるためではないのが一般的です。
例えば、
select x.*,rownum from (select * from target order by key) x;

select x.*,rownum from (select * from target) x order by key;
は、全く異なる結果になります。
8i以降、サブクエリ中でorder指定が可能になったのは、そういう目的です。
8i未満の場合、order指定が出来ないために、保証されない色んな方法でサブクエリ内での処理順を決める必要がありましたので。
回答者:k_o_r_o_c_h_a_n
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
07/10/04 01:46
この回答へのお礼ご回答ありがとうございます!
--
サブクエリの中で、order指定をするのは、データを加工する時に、加工する順番に意味がある場合で、
問い合わせ全体の出力順を決めるためではないのが一般的です。
--
そのとおりですね。。
丁寧にわかりやすいSQLまであげていただき
ありがとうございました。

回答良回答10pt

ANo.2 Orcleに関して申しますと、
8iからは、インラインビューの中にOrder Byが記述できるようになっています。
回答者:trictrac
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
07/10/03 06:57
この回答へのお礼ご回答ありがとうございます!
select * from (select * from 社員 where …)
をインラインビューと呼ぶことをはじめて知りました。。。

回答

ANo.1 > 6行目に書いたorderbyの動作(ソートキーの降順に並ぶこと)は
> oracle,sql server等、各環境で保障されるのでしょうか?

少なくとも Oracle では保障されない (バージョンが変わったときに動作が変更される可能性がある、製品の不具合などで期待された結果にならなかったとしてもサポートからの回答として「保障されません」で交わされるなど) と思います。

とは言っても、実際にはそのようになるでしょうが。
> 以下の例ではうまく動作していたのですが(oracle)
> 入れ子が多くなった場合もうまくうごくのでしょうか?

恐らくうまく動くでしょう。
ただし、繰り返しになりますが、保障はされないと思います。
回答者:entree
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
07/10/02 23:45
この回答へのお礼ご回答ありがとうございます!
保障されないかぎり、使わないほうがよいですね。。