2008-09-15 13 views
7

タスク:異なるRDBMSに適したデータベースレコードのページングを実装します。メソッドは、MSSQL2000 +、Oracle、MySqlなどのメインストリームエンジンで動作するはずですデータベースエンジンに依存しないページングを実装する方法は?

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

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

答えて

5

SQL仕様にページングが標準で含まれていた場合、汎用的な解決策がありました。任意のRDBMS言語がRDBMS言語と呼ばれるための要件には、ページングサポートも含まれていません。

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

データベースシステム自体に組み込まれていない限り、またはOracle、MySQL、またはOracleを使用するABCという会社がない限り、普遍的なソリューション(誰でも自由にここで間違っていると証明することができます) SQL Serverを使用しており、さまざまなデータベースシステムすべてに、データベース開発者が独自のページングを実装して、それを使用するコード用の汎用インターフェイスを提供することにしました。

+0

まあ、私は別のソリューションを試してみましたが、それは多かれ少なかれポータブル版を作成することは不可能と思われる。 – aku

0

JPAを使用して、Queryクラスでそれを行うことができます知っています:

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

結果セットの最初の10個の結果が表示されます。

DBMS独立した未処理のSQLソリューションが必要な場合は、運が悪いと思います。すべてのベンダーはそれを違う方法で行います。

3

ページングを行う最も自然で効率的な方法は、LIMIT/OFFSET(SybaseのTOP)構造を使用することです。 DB非依存の方法は、実行中のエンジンを知り、適切なSQL構造を適用する必要があります。

少なくとも、これは私がDB独立ライブラリのコードで行ったのと同じ方法です。特定のクエリを使用してエンジンからデータを取得すると、ページングロジックを抽象化できます。

本当に単一の1つのSQL文ソリューションをお探しの場合は、あなたが念頭に置いていることを示すことができますか? tempテーブルソリューションのSQLと同じです。おそらくより関連性の高い提案を得るでしょう。

EDIT:

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

これで、「LIMIT/OFFSETまたは同等のものを使用せずにページングを実装する方法はありますか?私は答えが "Sanely、no"だと思います。あなたはカーソルを使ってみることもできますが、そこにはデータベース特有の文章や行動にも惑わされます。

ちょうど私に起こったwacko(read stupid)というアイデアは、create table test(id int、name varchar、phone varchar、page int)というページ列をテーブルに追加し、 1つのテーブルからselect * from page = 1。これは、その列を維持するためのコードを追加する必要があることを意味します。これは、データベース全体を取り込むかデータベース固有の構造を使用することによってのみ行うことができます。これは、各可能な順序ごとに異なる列を追加しなければならず、他の多くの欠陥があります。

私は証拠を提供することはできませんが、本当にあなたはそれをうまく行かないと思います。

1

通常通り:
標準に従って実装します。次にコーナーケース、つまり標準を実装していないDBMSを処理します。コーナーケースを処理する方法は、開発環境によって異なります。

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

私は、標準および(カーソルを含む)の実装について書いた:私は質問に書いたように http://troels.arvin.dk/db/rdbms/#select-limit-offset

+0

Troels Arvin、かなり便利なページ、ありがとう! – aku

0

@Vinko Vrsalovic、

は、私はほとんどのDBでそれを行う方法を知っています。私は普遍的な解決策を見つけるか、それが存在しないという証拠を得る。

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

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 
+0

このアプローチの問題点は、IDENTITYは標準SQLですが、すべてのデータベースで使用できるわけではありません。また、SELECT TOPは標準SQLでも広く実装されていません。それとは別に、データのコピーは、一時表を使用しない方法と比較してはるかに遅い操作である可能性があります。 –

+0

おそらく、テンポラリテーブルを作成するのではなく、ビューが適用される可能性がありますか?列の1つがID列であるビューを作成できますか? –

+0

@ 1800 INFORMATION、例を示すことができます – aku

関連する問題