dポイントプレゼントキャンペーン実施中!

データ取得時に列番号を組み込みたい場合
ROW_NUMBER() OVER (ORDER BY ソートキー)
で実現できますが、これは実際ソートも行ってくれるのでしょうか?

例えば
1)
select dt1,dt2, dt3,ROW_NUMBER() OVER (ORDER BY dt1,dt2,dt3) as dt4
from table_1

2)
select dt1,dt2, dt3
from table_1
ORDER BY dt1,dt2,dt3

では同じ順序でデータが取得されるのでしょうか?
簡単にデータを作ってみたところ、同じようなんですが・・・・

A 回答 (1件)

SQL SERVER 2008 R2、 PostgreSQL 9.1(cygwin)で試したところではrow_number()のover句でのオーダー順で出力されました。


実行計画をみても、WINDOWSソートの後はシーケンス処理のみということで今の実装上ではover句の指定順になると思われます。
なお、SELECT文の最後にORDER BYでROW_NUMBER関数の値を指定したところ、SQL SERVER 2008 R2では無視(最適化)され、PostgreSQLでは実行されるようです。
ただし、SQLの規格としてはおそらくover句順を保証してはいないと思います。

この回答への補足

ありがとうございます。

SQLServer2008 では無視(最適化)されるとのことですがこれはどういう意味なんでしょうか?

試してみたものは 2005 Express なのですが、実装は 2008 R2 なので詳細が気になります。
2008 R2 はMK時にインストールする予定なのでまだ環境はありません。

結局

select dt1,dt2, dt3, dt4 from
(
select dt1,dt2, dt3,ROW_NUMBER() OVER (ORDER BY dt1,dt2,dt3) as dt4
from table_1
) mainsearch
order by dt4

と記述するということで問題ないのでしょうか?
(うろ覚えですが order とか where とかってエイリアスはNGだったようなので・・・)

補足日時:2012/09/07 08:19
    • good
    • 0

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