カテゴリー
technology

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;

「ROWNUM との格闘」への1件の返信

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

コメントは受け付けていません。