7

タスク: さまざまな RDBMS に適したデータベース レコードのページングを実装します。メソッドは、主流のエンジン (MSSQL2000+、Oracle、MySql など) で機能するはずです。

RDBMS 固有のソリューションを投稿しないでください。最新のデータベース エンジンのほとんどにこれを実装する方法を知っています。私は普遍的な解決策を探しています。現時点では、一時テーブルベースのソリューションのみが頭に浮かびます。

編集:
サードパーティのライブラリではなく、SQL ソリューションを探しています。

4

6 に答える 6

5

SQL仕様に標準としてページングが含まれていれば、普遍的な解決策があったでしょう。RDBMS言語をRDBMS言語と呼ぶための要件には、ページングのサポートも含まれていません。

多くのデータベース製品は、標準言語に対する独自の拡張機能を備えたSQLをサポートしています。それらのいくつかは、制限句を使用したMySQL、Oracleを使用したRowidなどのページングをサポートしています。それぞれ異なる方法で処理されます。他のDBMSは、ROWIDなどと呼ばれるフィールドを追加する必要があります。

データベースシステム自体に組み込まれていない限り、またはOracle、MySQL、SQL Serverを使用するABCと言う会社がない限り、ユニバーサルソリューション(誰でもここで私が間違っていることを自由に証明できます。議論の余地があります)を利用できるとは思いません。さまざまなデータベースシステムすべてに、データベース開発者による独自のページングの実装を提供させ、それを使用するコードにユニバーサルインターフェイスを提供することを決定します。

于 2008-09-24T10:53:47.080 に答える
3

ページングを行う最も自然で効率的な方法は、LIMIT/OFFSET (Sybase の世界では TOP) 構文を使用することです。DBに依存しない方法では、それが実行されているエンジンを認識し、適切なSQL構造を適用する必要があります.

少なくとも、DB に依存しないライブラリのコードで見た方法です。特定のクエリを使用してエンジンからデータを取得したら、ページング ロジックを抽象化できます。

単一の 1 つの SQL 文による解決策を本当に探しているのであれば、何を考えているのか教えていただけますか? 一時テーブル ソリューションの SQL と同様です。おそらく、より関連性の高い提案が得られるでしょう。

編集:

エンジン固有の構成を使用せずに一時テーブルでそれを行う方法がわからなかったので、あなたが何を考えているのかを見たかったのです。例では特定の構造を使用しました。(実装された) 標準 SQL のみを使用してデータベースにページングを実装する方法はまだわかりません。テーブル全体を標準 SQL に取り込み、ページをアプリケーションに取り込むこともできますが、それは明らかにばかげています。

したがって、質問は「LIMIT/OFFSET または同等のものを使用せずにページングを実装する方法はありますか?」のようなものになります。答えは「正気ではありません」だと思います。カーソルを使用することもできますが、データベース固有の文/動作の餌食にもなります。

私が思いついた奇抜な (愚かなことを読む) アイデアは、テーブルにページ列を追加することです。たとえば、テーブル テスト (id int、name varchar、phone varchar、page int) を作成すると、select * でページ 1 を取得できます。 from table where page = 1.しかし、それはその列を維持するためにコードを追加しなければならないことを意味します。これも、データベース全体を持ってくるか、データベース固有の構造を使用することによってのみ行うことができます。それ以外にも、可能な順序ごとに異なる列を追加する必要があり、その他の多くの欠陥があります。

証拠は出せませんが、あなたは正気ではないと思います。

于 2008-09-15T06:36:59.887 に答える
1

いつものように進みます:
標準に従って実装することから始めます。そして、標準を実装していない DBMS などのコーナー ケースを処理します。コーナー ケースの処理方法は、開発環境によって異なります。

あなたは「普遍的な」アプローチを探しています。ページネーションの最も一般的な方法はカーソルを使用することですが、カーソルベースのページネーションは、Web アプリケーションのようなステートフルでない環境にはあまり適していません。

ここに標準と実装 (カーソルを含む) について書きました: http://troels.arvin.dk/db/rdbms/#select-limit-offset

于 2008-09-15T07:05:03.550 に答える
0

SubSonic は、オープン ソースを許容できる場合は、これを行うことができます... http://subsonicproject.com/querying/webcast-using-paging/

それ以外は、NHibも同様であることを知っています

于 2008-09-15T00:26:58.653 に答える
0

JPA では、Query クラスを使用してそれを行うことができます。

Query q = ...;
q.setFirstResult (0);
q.setMaxResults (10);

結果セットの最初の 10 個の結果が得られます。

DBMS に依存しない未加工の SQL ソリューションが必要な場合は、運が悪いと思います。すべてのベンダーは異なる方法でそれを行います。

于 2008-09-15T00:31:06.350 に答える
0

@ヴィンコ・ヴルサロビッチ、

問題に書いたように、ほとんどのDBでそれを行う方法を知っています。普遍的な解決策を見つけるか、それが存在しないという証拠を得る必要があります。

これは、一時テーブルに基づく愚かな解決策の 1 つです。明らかに悪いので、コメントする必要はありません。

N - upper bound
M - lower bound

create #temp (Id int identity, originalId int)

insert into #temp(originalId)
select top N KeyColumn from MyTable
where ...

select MyTable.* from MyTable
join #temp t on t.originalId = MyTable.KeyColumn
where Id between M and M
order by Id asc

drop #temp
于 2008-09-15T07:49:41.990 に答える