--.--.--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2007.05.31

第253夜 其の3

SELECT文の取得行に通番を振りたい場合・・・。

ぱっと調べるとROWNUMという擬似カラムが良さそうです。

select
ROWNUM,
t.*
from
table t
where
t.delflg = '0'

SQLは適当ですが、正しく1番から通番されます。
ところが・・・。

select
ROWNUM,
t.*
from
table t
where
t.delflg = '0'
order by
t.name

ORDER BY句を付けると正しく通番されません。
どうもROWNUMはORDER BYを実行する前に通番され、その後にORDER BY句が実行されるからのようです。

一応、こんな回避策がありました。

select
rownum,
t.*
from
(select
ROWNUM,
t.*
from
table t
where
t.delflg = '0'
order by
t.name) t

ORDER BY句があるから問題なので、メイン部を副問い合わせにして回避;

もう少し調べてみると、ROW_NUMBER()というのがオラクルにありました。

select
ROW_NUMBER() OVER (order by t.name),
t.*
from
table t
where
t.delflg = '0'
order by
t.name

これならORDER BY句があっても問題なさそうです。
ただorder by句で一意にならない場合、正しく通番されない可能性があるようです。

そこでROWIDを追加するともう少し安心かもしれません。

select
ROW_NUMBER() OVER (order by t.name, t.ROWID),
t.*
from
table t
where
t.delflg = '0'
order by
t.name,
t.ROWID

ROWIDはテーブルの内部カラムみたいなもの?
各テーブルに同じ値はないはずなので、これで一意になるはず・・・。
この記事へのトラックバックURL
http://hexagram.blog41.fc2.com/tb.php/263-09b7a596
この記事へのトラックバック
この記事へのコメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。