プロが教える店舗&オフィスのセキュリティ対策術

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

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

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

お礼日時:2007/10/06 12:11

Orcleに関して申しますと、


8iからは、インラインビューの中にOrder Byが記述できるようになっています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/10/06 11:55

> 6行目に書いたorderbyの動作(ソートキーの降順に並ぶこと)は


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

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

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

恐らくうまく動くでしょう。
ただし、繰り返しになりますが、保障はされないと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/10/06 11:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!