- - PR -
SQLの結果を分割して取得する方法について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-01-18 13:52
#Insider.NET 会議室にスレッドを作成しましたが、こちらに移動します。
ORACLE 7.3.4を使用しています。 SQLの結果を取得する際に、大量データの場合、 データを分割して取得したいと考えているのですが、 良い方法が見当たりません。 例えば10,000件のデータを表示する際に、 「1〜1,000」「1,001〜2,000」・・・のように、 必要な箇所のみ取得したいと考えております。 -------------------------- SELECT COL1,COL2 FROM ( SELECT COL1,COL2,CEIL(ROWNUM/1000) R_NUM FROM TBL1 WHERE ROWNUM <= 2000 ) WHERE R_NUM = 2 ORDER BY COL1 -------------------------- このSQL文で「1,001〜2,000件」を取得出来ますが、 全件を取りに行った後に、必要な情報を抽出しているので、 効率は良くありません。 大変恐縮ですが、効率よく必要な情報を取得できる方法を ご存知の方がおられましたら、ご教授願います。 よろしくお願いします。 | ||||
|
投稿日時: 2007-01-18 16:44
お世話になっております。
例で挙げたSQLに問題がありました。 ORDER BY で表示データの並び替えを行っておりますが、 ROWNUMには当然ながら適用されません。 よって、この方法では「1,001〜2,000件」などのデータを 正しく取得出来ないことになります。 確認不足で申し訳ありません。 ORDER BY を使用して、順序を指定する事を前提とした場合、 分割することは出来ないでしょうか。 今思い浮かぶ方法としては、 ・ワークテーブルなどに、一時的にデータを格納する。 ・データセットに全データを投入し、プログラムの方で対処する。 これくらいです。 (どちらも非常にレスポンスが悪そうです・・) 勝手なお願いではありますが、方法をご存知の方がおられましたら ご教授お願いします。 | ||||
|
投稿日時: 2007-01-18 17:21
none です
かれこれ5年ぐらいOracleは触っていないですし 現在、環境もないんですが 一回のSQLでやるんだったら こんな感じになるんですかね? ------------------------------ SELECT COL1,COL2 FROM ( SELECT ROWNUM R_NUM,COL1,COL2 FROM ( SELECT COL1,COL2 FROM TBL1 ORDER BY COL1 ) ) WHERE R_NUM BETWEEN 1001 AND 2000 ORDER BY COL1; ------------------------------ まぁ、参考程度ということで ^^; | ||||
|
投稿日時: 2007-01-18 17:33
>none様
お返事ありがとうございます。 私も最初、そのようにSQLを作成したのですが、 ORDER BY をSELECT句ではさむとエラーとなってしまいます。 (ORACLE 7の仕様かもしれません) ソートされた結果に対してROWNUMで行番号を取得したいのですが、 上記エラーにより、無理そうな感じです。 折角ご回答頂いたのに申し訳ありません。 | ||||
|
投稿日時: 2007-01-19 01:05
そうです。Oracle 7.xではまだこの記述はできません。 結局のところ、Order byでカラムを指定するのでサーバー側ではがっつり全件 ソートされてしまいます。なので、結局行数指定しても、単に、サーバーと クライアント間のやりとりの効率化だけのような気がします。 ミドルウエアがなにか不明なのですが、OCIなら単に、通常のSQLを投げて、 Fetchするときに、1000行単位でもってくればいいだけのような気がしますが。 # 複数行Fetchの機能があるので>>OCI 7.x | ||||
|
投稿日時: 2007-01-19 06:56
OTNで過去に議論されてます
http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cgi?communityid=otn-901233&bbsid=1&no=8857&view=9 Oracle7でwhere句でのスカラー副問い合わせが使えるか不明ですが、 自己結合で順位をつけてもパフォーマンスは悪そう | ||||
|
投稿日時: 2007-01-19 18:57
スカラー副問い合わせは Oracle 9iの新機能なので使えませんね。
ソートの対象列が一意な値を持つなら、 ・1000件ずつ取り出すときに、最後に取り出した行のソート対象キーの値を覚えておく ・次はその値より大きい値の物だけを取得するようにする とすれば、後の方に行くに従ってソート対象データ量が減るので多少パフォーマンスが上がるかもしれません。 # Oracle7は検索で見つかった順に ROWNUM を付与して、その後にソートしますので、 # ソートと ROWNUM の併用はそもそも無理です。 | ||||
|
投稿日時: 2007-01-19 21:16
Oracle7 の環境はないので動作確認していませんが
スカラー副問い合わせ<式>が Oracle 9iの新機能なので Oracle7 でもスカラー副問い合わせを使用した 相関副問い合わせは可能だと思いますよ。 OTN の ----- SELECT COL1,COL2 FROM TBL1 x WHERE 1000 >= ( SELECT COUNT(COL1) 〜 ----- みたいな形式です。 効率についてはパスします。 |