- PR -

SQLの結果を分割して取得する方法について

投稿者投稿内容
miyavi
常連さん
会議室デビュー日: 2006/12/07
投稿数: 27
投稿日時: 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件」を取得出来ますが、
全件を取りに行った後に、必要な情報を抽出しているので、
効率は良くありません。

大変恐縮ですが、効率よく必要な情報を取得できる方法を
ご存知の方がおられましたら、ご教授願います。

よろしくお願いします。
miyavi
常連さん
会議室デビュー日: 2006/12/07
投稿数: 27
投稿日時: 2007-01-18 16:44
お世話になっております。

例で挙げたSQLに問題がありました。

ORDER BY で表示データの並び替えを行っておりますが、
ROWNUMには当然ながら適用されません。

よって、この方法では「1,001〜2,000件」などのデータを
正しく取得出来ないことになります。

確認不足で申し訳ありません。

ORDER BY を使用して、順序を指定する事を前提とした場合、
分割することは出来ないでしょうか。

今思い浮かぶ方法としては、
 ・ワークテーブルなどに、一時的にデータを格納する。
 ・データセットに全データを投入し、プログラムの方で対処する。
これくらいです。
(どちらも非常にレスポンスが悪そうです・・)

勝手なお願いではありますが、方法をご存知の方がおられましたら
ご教授お願いします。
none
会議室デビュー日: 2003/01/06
投稿数: 3
投稿日時: 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;
------------------------------

まぁ、参考程度ということで ^^;
miyavi
常連さん
会議室デビュー日: 2006/12/07
投稿数: 27
投稿日時: 2007-01-18 17:33
>none様
お返事ありがとうございます。

私も最初、そのようにSQLを作成したのですが、
ORDER BY をSELECT句ではさむとエラーとなってしまいます。
(ORACLE 7の仕様かもしれません)

ソートされた結果に対してROWNUMで行番号を取得したいのですが、
上記エラーにより、無理そうな感じです。

折角ご回答頂いたのに申し訳ありません。
MeijiK
常連さん
会議室デビュー日: 2005/12/26
投稿数: 24
お住まい・勤務地: 東京都
投稿日時: 2007-01-19 01:05
引用:

(ORACLE 7の仕様かもしれません)



そうです。Oracle 7.xではまだこの記述はできません。

結局のところ、Order byでカラムを指定するのでサーバー側ではがっつり全件
ソートされてしまいます。なので、結局行数指定しても、単に、サーバーと
クライアント間のやりとりの効率化だけのような気がします。

ミドルウエアがなにか不明なのですが、OCIなら単に、通常のSQLを投げて、
Fetchするときに、1000行単位でもってくればいいだけのような気がしますが。
# 複数行Fetchの機能があるので>>OCI 7.x
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 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句でのスカラー副問い合わせが使えるか不明ですが、
自己結合で順位をつけてもパフォーマンスは悪そう
ひろ@ya
大ベテラン
会議室デビュー日: 2006/02/23
投稿数: 168
投稿日時: 2007-01-19 18:57
スカラー副問い合わせは Oracle 9iの新機能なので使えませんね。

ソートの対象列が一意な値を持つなら、

・1000件ずつ取り出すときに、最後に取り出した行のソート対象キーの値を覚えておく
・次はその値より大きい値の物だけを取得するようにする

とすれば、後の方に行くに従ってソート対象データ量が減るので多少パフォーマンスが上がるかもしれません。

# Oracle7は検索で見つかった順に ROWNUM を付与して、その後にソートしますので、
# ソートと ROWNUM の併用はそもそも無理です。
未記入
会議室デビュー日: 2006/03/22
投稿数: 19
投稿日時: 2007-01-19 21:16
Oracle7 の環境はないので動作確認していませんが
スカラー副問い合わせ<式>が Oracle 9iの新機能なので
Oracle7 でもスカラー副問い合わせを使用した
相関副問い合わせは可能だと思いますよ。
OTN の
-----
SELECT COL1,COL2 FROM TBL1 x
WHERE
1000 >= ( SELECT COUNT(COL1) 〜
-----
みたいな形式です。
効率についてはパスします。

スキルアップ/キャリアアップ(JOB@IT)