※少し手がかりを見つけたので再度質問します。

Oracleの質問です。
10000件以上あるデータから、1000件ずつ結果抽出しようとしています。

where句が
rownum >= 0 and rownum < 1000
では、正しく結果を得られますが、
rownum >= 1000 and rownum < 2000
以降は「レコードが選択されませんでした」になります。
rownum指定なしでは、確実に結果が得られるのですが、考えられる要因はなんでしょうか?

以下のサイトを見ると、
http://www.oikaze.com/~tamada/Products/torque/
> org.apache.torque.adapter.DBOracle というクラスの中に supportNativeLimit と
> getLimitStyle という 二つのメソッドがあります。 この帰り値を false と
> DB.LIMIT_STYLE_NONE に変更します。

という記述があります。
これをPHPで設定するには、
// $db->setOption( 'supportNativeLimit', 'false' ); // これも念のため試しました
$db->setOption( 'supportNativeLimit', false );
$db->setOption( 'getLimitStyle', 'LIMIT_STYLE_NONE' );
というような記述ではNGなのでしょうか?(PEAR:DBを使用しています)
※変数名のすべて小文字も試しましたがNGでした。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/01/10 23:35:42
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント55pt

投稿した瞬間にキャンセルとなってしまってびっくり(@_@)


本題ですが原因はSQL文にあります。

『SQLの結果より、n件目から10件取得』

http://www.oracle.co.jp/2shin/ora81/16_17.html

最初に選択されたレコードに対応するROWNUMは1になります。これでは11以上20以下という条件に合わず、対象外となって次のレコードを選択します。

rownum >= 0 and rownum < 1000

この場合では最初に選択された条件が1となりますので千件分の抽出が可能ですが、

rownum >= 1000 and rownum < 2000

こちらの場合、、、、最初に選択された条件が1となってしまった段階で、既にどちらの条件にも合致しないという事になってしまいます。


従って、上記ページにありますように、

SELECT column_1,column_2,column_3

FROM (SELECT column_1,column_2,column_3,rownum AS

rm FROM table_name) WHERE rm >=11 and rm<=20;

といったような形でrownumを割り振ってから抽出するというような工夫が必要になります。

id:P-mako

★追加コメント★

わかりました。内側のWHEREですでにhoge='foo'済みなので、外側のWHEREには、この条件が不要だったわけですね。

SELECT column_1,column_2,column_3

FROM (SELECT column_1,column_2,column_3,rownum AS

rm FROM table_name WHERE hoge='foo') WHERE rm >=11 and rm<=20;

ということでした。

ありがとうございます。


> 投稿した瞬間にキャンセルとなってしまってびっくり(@_@)

すみませんでしたm(__)m

近しいヒントが見つかった気がしましたので(^^;

すばやいご回答ありがとうございます。

話を簡略化していましたが、実はWHERE句には他にも条件があります。

その場合、上記は、

SELECT column_1,column_2,column_3

FROM (SELECT column_1,column_2,column_3,rownum AS

rm FROM table_name WHERE hoge='foo') WHERE rm >=11 and rm<=20 and hoge='foo';

で良いのでしょうか?

(どうもそのようにやっているつもりなんですがNGです。ひょっとするとeasyミスかも知れませんが)

可能であれば再回答お願いします。

2007/01/10 23:35:11

その他の回答1件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301ここでベストアンサー

ポイント55pt

投稿した瞬間にキャンセルとなってしまってびっくり(@_@)


本題ですが原因はSQL文にあります。

『SQLの結果より、n件目から10件取得』

http://www.oracle.co.jp/2shin/ora81/16_17.html

最初に選択されたレコードに対応するROWNUMは1になります。これでは11以上20以下という条件に合わず、対象外となって次のレコードを選択します。

rownum >= 0 and rownum < 1000

この場合では最初に選択された条件が1となりますので千件分の抽出が可能ですが、

rownum >= 1000 and rownum < 2000

こちらの場合、、、、最初に選択された条件が1となってしまった段階で、既にどちらの条件にも合致しないという事になってしまいます。


従って、上記ページにありますように、

SELECT column_1,column_2,column_3

FROM (SELECT column_1,column_2,column_3,rownum AS

rm FROM table_name) WHERE rm >=11 and rm<=20;

といったような形でrownumを割り振ってから抽出するというような工夫が必要になります。

id:P-mako

★追加コメント★

わかりました。内側のWHEREですでにhoge='foo'済みなので、外側のWHEREには、この条件が不要だったわけですね。

SELECT column_1,column_2,column_3

FROM (SELECT column_1,column_2,column_3,rownum AS

rm FROM table_name WHERE hoge='foo') WHERE rm >=11 and rm<=20;

ということでした。

ありがとうございます。


> 投稿した瞬間にキャンセルとなってしまってびっくり(@_@)

すみませんでしたm(__)m

近しいヒントが見つかった気がしましたので(^^;

すばやいご回答ありがとうございます。

話を簡略化していましたが、実はWHERE句には他にも条件があります。

その場合、上記は、

SELECT column_1,column_2,column_3

FROM (SELECT column_1,column_2,column_3,rownum AS

rm FROM table_name WHERE hoge='foo') WHERE rm >=11 and rm<=20 and hoge='foo';

で良いのでしょうか?

(どうもそのようにやっているつもりなんですがNGです。ひょっとするとeasyミスかも知れませんが)

可能であれば再回答お願いします。

2007/01/10 23:35:11
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント15pt

実行している SQL がもう少し無いと判断しにくいですね。

http://www.mitene.or.jp/~rnk/TIPS_ORCL_INSERT.htm#INS4


とりあえず、あげられているページは Java の Torque と言う ORマッパーの説明が書かれています。

設定も Torque 特有のものなので、PHP の場合参考にならないと思います。

  • id:b-wind
    SELECT column_1,column_2,column_3
    FROM (SELECT column_1,column_2,column_3,rownum AS
    rm FROM table_name WHERE hoge='foo') WHERE rm >=11 and rm<=20;

    外側の hoge='foo' はいらない。
    というかサブクエリの出力に hoge カラムが無いので出来ない。
    あとサブクエリに ORDER BY 無くていいのですか?
    出力結果が予測できなくなってしまいそうですが。
  • id:kn1967
    >びっくり(@_@)

    ちょっとタイミングがぴったりだったので、、、、
    気になさっておられたら、申し訳ないです。

    余計なお世話になりますが、
    http://q.hatena.ne.jp/1168418318
    『※問題ないという回答は不要です。』という事ですが『問題が無いから回答が無い』のか『誰も回答をつけていないだけ』かの判別をつけられないのではありませんか?
    『大丈夫の場合は説明をお願いします』といったような文章のほうが良いと思いますけど、、、

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません