- PR -

SELECT文でn件目からn件分読み込みたい

1
投稿者投稿内容
キョロちゃん
会議室デビュー日: 2003/07/09
投稿数: 6
投稿日時: 2004-04-20 09:48
SELECT文でTOPを指定すると先頭からn件読み込むことができますが、
n件目からn件分読み込む事ってできますか?
(WHERE句にひっかかった先頭100件目から100件分読み込みたい)

よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-20 09:59
引用:

キョロちゃんさんの書き込み (2004-04-20 09:48) より:
SELECT文でTOPを指定すると先頭からn件読み込むことができますが、
n件目からn件分読み込む事ってできますか?
(WHERE句にひっかかった先頭100件目から100件分読み込みたい)



 ターゲットとなるDBMSは何でしょう?SQL Serverにはそのような関数があるようです。その他のDBMSにはないものが多いです。


 汎用的にするなら、インライン問い合わせで行番号を振り、行番号でもう一度絞り込むという方法があります。・・・行番号を振る関数に汎用性がないのだが。。。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-04-20 10:24
引用:

キョロちゃんさんの書き込み (2004-04-20 09:48) より:
SELECT文でTOPを指定すると先頭からn件読み込むことができますが、
n件目からn件分読み込む事ってできますか?
(WHERE句にひっかかった先頭100件目から100件分読み込みたい)

よろしくお願いします。



「できますか?」と問われれば、「分かりません」と答えるしかないように思うのですが。
何しろ、環境が分かりませんので……。

突き当たってらっしゃる問題は検索結果のページ処理等かと思いますが、それでしたら様々なところで行われている処理であり、検索すればそれぞれのDBMSに対応したTipが比較的簡単に見付かります。頑張ってください。

この掲示板内でも例えば
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9418&forum=7
等にそういう話題があります。
#自分がアイタタな発言をやらかしてしまったスレッドのポインタを出すのもアレですが
TakeOne
会議室デビュー日: 2004/03/04
投稿数: 9
投稿日時: 2004-04-20 10:50
ここの下のほうにtopを組み合わせて取得する方法が書いてあります。
http://www.sqlpassj.org/bunkakai/web/series/ado/04.aspx
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-04-20 11:03
所謂「オープンソース」と呼ばれる概ねGPLに基づく配布自由、商用に於いてすら無料
のソース公開RDBMSも、今や市販高額RDBMSに負けないぐらいの機能は持っているか、
或いは持ちつつある。

MySQL なら mysql_data_seek() と select 構文の limit 句 を組み合わせるか、好きな
だけ for 分でレコード引っ張る。
PostgreSQL ならば、pg_result_seek() と select 構文の limit 句を組み合わせるか、
好きなだけ for 分でぐるぐる回すか、select の段階で offset 句 と limit 句組み合わせる。

 まぁ、結局のところ1レコードずつ進めたり戻したりするのに for 文は必要になってくる
と思いますが・・・

Access, SQL Server は、私には関係が無いので使った事が無い。
使ったことがないので、全くわからない。

[ メッセージ編集済み 編集者: コブラ 編集日時 2004-04-20 11:05 ]
キョロちゃん
会議室デビュー日: 2003/07/09
投稿数: 6
投稿日時: 2004-04-20 11:51
申し訳ありません。
SQL-Server2000を使用しています。
開発環境は.NET C#
WindowsApplication作成です。

データアダプタのクエリビルダで簡単に作れるものなのか、
それともストアドプロシージャを駆使しなければならないものなのでしょうか?
まだ勉強不足なのでご教授願いたいです。
よろしくお願いします。

[ メッセージ編集済み 編集者: キョロちゃん 編集日時 2004-04-20 12:15 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-20 12:16
引用:

キョロちゃんさんの書き込み (2004-04-20 11:51) より:

データアダプタのクエリビルダで簡単に作れるものなのか、


それでは無理です。

TakeOneさんが紹介されているところでは、すべての件数があらかじめわかっていなければなりません。が、もう1段インラインビューをかませば、あらかじめわかっていなくてもいけそうです。

> SELECT文でn件目からn件分読み込みたい
たとえば、「2件目から2件」、「3件目から3件」?「n件目からm件分」ですよね。

コード:
SELECT *
 FROM (
   SELECT TOP m *
    FROM (
      SELECT TOP n + m
       column clause
       FROM table
       WHERE where clause
       ORDER BY order clause ASC /-- 最初からページの最後のレコードまで
    )
    ORDER BY order clause DESC /-- ページの最後から最初のレコードまで
 )
 ORDER BY order clause ASC /-- その結果をひっくり返す


Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2004-04-21 09:23
おさです。

Jittaさんの紹介を参考にさせていただくと、こんな方法もあります。

コード:
   SELECT TOP m *
    FROM table WHERE keyColumn NOT IN
      (SELECT TOP n keyColumn
       FROM table
       ORDER BY order clause)
    ORDER BY order clause

1

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