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

解決済みの質問

order by区の記述位置

以下のような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 は最後に書くものだと思っていたのですが、
たまたま上記のような入れ子になった内側でソートしているソースを見ることがあり
みなさんにお話をうかがいたく質問させていただきました。
よろしくお願いいたします。

投稿日時 - 2007-10-02 14:08:18

QNo.3394901

困ってます

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

>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指定が出来ないために、保証されない色んな方法でサブクエリ内での処理順を決める必要がありましたので。

投稿日時 - 2007-10-04 01:46:49

お礼

ご回答ありがとうございます!
--
サブクエリの中で、order指定をするのは、データを加工する時に、加工する順番に意味がある場合で、
問い合わせ全体の出力順を決めるためではないのが一般的です。
--
そのとおりですね。。
丁寧にわかりやすいSQLまであげていただき
ありがとうございました。

投稿日時 - 2007-10-06 12:11:58

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

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

回答(3)

ANo.2

Orcleに関して申しますと、
8iからは、インラインビューの中にOrder Byが記述できるようになっています。

投稿日時 - 2007-10-03 06:57:45

お礼

ご回答ありがとうございます!
select * from (select * from 社員 where …)
をインラインビューと呼ぶことをはじめて知りました。。。

投稿日時 - 2007-10-06 11:55:05

ANo.1

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

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

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

恐らくうまく動くでしょう。
ただし、繰り返しになりますが、保障はされないと思います。

投稿日時 - 2007-10-02 23:45:37

お礼

ご回答ありがとうございます!
保障されないかぎり、使わないほうがよいですね。。

投稿日時 - 2007-10-06 11:53:11

あなたにオススメの質問