« Google ツールバー バレンタイン バージョン | メイン | ひとり遊び、ひとり仕事 »

ROWNUM との格闘

Oracle で 2番目の値だけを取得しようと ROWNUM を使って以下の SQL 試してみるも失敗。

SELECT * FROM (SELECT * FROM foo ORDER BY bar) WHERE ROWNUM = 2;

さまざまな SQL を試してみたりしていたのですが Oracle のマニュアルを熟読してたらなんと!条件に合致してフェッチされるデータに対して ROWNUM が振られているとか。

つまり前述の SQL では、始めの行をフェッチして来たデータ(ROWNUM = 1)は ROWNUM = 2 に該当しないので、次の行をフェッチする。このとき、やはり初めて条件に合致するだろうデータとして扱うので ROWNUM = 1 となり条件に一致しない(ROWNUM = 2 ではない)ので次の行をフェッチする。以降、繰り返し...

というわけで ROWNUM = 2 に該当するデータなんてありゃしない、と。

しかし久しぶりに Oracle 触ったらハマってしまった。何やら恥ずかしい感じ。そもそも SQL だけでというのは無理があったわけね。アプリケーション側で対応するか。

ちなみに、これは思った通りの結果になるけど、何の意味もない。

SELECT * FROM (SELECT * FROM foo ORDER BY bar) WHERE ROWNUM = 1;

トラックバック

このエントリーのトラックバックURL:
http://5net.com/mt/mt-tb.cgi/95

コメント (1)

SELECT
*
FROM
(
SELECT
A.*
,ROWNUM AS COUNT
FROM
(
SELECT
*
FROM
foo
ORDER BY
bar
) A
)
WHERE
COUNT = 2

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Amazon Search