11

知っている:

  • ファイヤーバード:FIRSTSKIP;
  • MySQL LIMIT:;
  • SQL Server ROW_NUMBER():;

誰かが結果ページングを実行するSQLANSIの方法を知っていますか?

4

8 に答える 8

7

このページの制限 — オフセット付きセクションを参照してください。http://troels.arvin.dk/db/rdbms/

ところで、Firebird はバージョン 2.0 以降、ROWS 句もサポートしています。

于 2009-01-21T14:58:13.703 に答える
2

正式な方法はありません。

一般に、データベース アクセス レイヤーに抽象化された関数を用意して、それに対処できるようにする必要があります。MySQL または PostgreSQL を使用しているというヒントを与えて、クエリに 'LIMIT' 句を追加したり、Oracle のサブクエリに rownum を追加したりできます。それらのいずれかを実行できることがわからない場合は、フォールバックしてロットを取得し、完全なリストのスライスのみを返します。

*: eta: ANSI SQL:2003 にあるようになりました。しかし、それはグローバルにサポートされておらず、パフォーマンスが悪いことが多く、ORDER をステートメント内の新しい場所に移動/コピーする必要があり、自動的にラップするのが難しくなるため、少し面倒です。

SELECT * FROM (
    SELECT thiscol, thatcol, ROW_NUMBER() OVER (ORDER BY mtime DESC, id) AS rownumber
)
WHERE rownumber BETWEEN 10 AND 20 -- care, 1-based index
ORDER BY rownumber;

SQL:2008 (およびそれが発生した DB2) には、「FETCH FIRST n ROWS ONLY」という接尾辞もあります。ただし、SQL Server の TOP プレフィックスや Informix の同様の構文と同様に、開始点を指定できないため、いくつかの行をフェッチして破棄する必要があります。

于 2009-01-21T02:26:53.567 に答える
0

結果をストレージ テーブルに挿入し、それらをどのように表示するかを並べ替えますが、新しい IDENTITY 列を使用します。

次に、そのテーブルから、関心のある ID の範囲だけを選択します。

(終わったら必ずテーブルを片付けてください)


または、プレゼンテーションに関係することは通常SQL Serverで行うべきではないため、クライアントで行います(私の意見では)

于 2009-01-21T01:51:07.990 に答える
0
ANSI Sql example:
offset=41, fetchsize=10

SELECT TOP(10) *
FROM table1
WHERE table1.ID NOT IN (SELECT TOP(40) table1.ID FROM table1)
于 2010-06-03T12:35:02.533 に答える
-1

ところで、Troels、PostgreSQL は Limit/Offset をサポートしています

于 2009-08-29T01:08:17.767 に答える