アカウント名:
パスワード:
いい加減LIMITを実装しないのは何か理由があるのですかね。
#何故かMySQLからOracleに載せ替えることになってSQLで発狂しかけた
ROWNUM BETWEENじゃあかんの?
ROWNUMはソート前の順番で割り振られるので、そのままではソート後のLIMITには使えません。しかたないので、本来の検索を丸ごとサブクエリとしてくるんで、その外側でROWNUMを振る必要があります。
さらに、ROWNUM は、WHERE節の条件に合致したレコードに対して、最初から順番に1,2,3,…と番号が振られるものなので、WHERE ROWNUM <= 10 のように先頭からデータを取り出しつつ、途中で取得を打ち切る、ということはできるのですが、WHERE ROWNUM > 10 とか WHERE ROWNUM IN ( 1, 3, 5 ) のような、ROWNUMが1から始まらなかったり歯抜けになるような条件指定はできないんです。
しかたないので、rownumを抽出したクエリをまたサブクエリとしてくるんで、その外側で範囲判定することになります。
まとめると、
SELECT * FROM hogehoge ORDER BY foober LIMIT 4,10
相当のことをOracleで実現するためには、
SELECT q2.* FROM ( SELECT q1.*, ROWNUM as r FROM ( SELECT * FROM hogehoge ORDER BY foobar ) q1) q2 WHERE r BETWEEN 5 AND 14
みたいな面倒くさいことをするハメになるってことです
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
普通のやつらの下を行け -- バッドノウハウ専門家
そんなことよりLIMITをだな (スコア:1)
いい加減LIMITを実装しないのは何か理由があるのですかね。
#何故かMySQLからOracleに載せ替えることになってSQLで発狂しかけた
Re:そんなことよりLIMITをだな (スコア:0)
ROWNUM BETWEENじゃあかんの?
Re:そんなことよりLIMITをだな (スコア:2)
ROWNUMはソート前の順番で割り振られるので、そのままではソート後のLIMITには使えません。
しかたないので、本来の検索を丸ごとサブクエリとしてくるんで、その外側でROWNUMを振る必要があります。
さらに、ROWNUM は、WHERE節の条件に合致したレコードに対して、最初から順番に1,2,3,…と番号が振られるものなので、
WHERE ROWNUM <= 10 のように先頭からデータを取り出しつつ、途中で取得を打ち切る、ということはできるのですが、
WHERE ROWNUM > 10 とか WHERE ROWNUM IN ( 1, 3, 5 ) のような、ROWNUMが1から始まらなかったり歯抜けになるような条件指定はできないんです。
しかたないので、rownumを抽出したクエリをまたサブクエリとしてくるんで、その外側で範囲判定することになります。
まとめると、
相当のことをOracleで実現するためには、
みたいな面倒くさいことをするハメになるってことです
Re:そんなことよりLIMITをだな (スコア:1)