データベースのテーブルからn番目の行を選択する、データベースに依存しない方法(理想)を知りたいと思っています。また、以下のデータベースのネイティブな機能を使って、どのように実現できるのかを見てみたいと思っています。
私は現在、SQL Server 2005で以下のようなことをしていますが、他の人たちのより積極的なアプローチを見てみたいと思います。
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
上記SQLのクレジット。Firoz Ansari's Weblogを参照してください。
Update: 標準SQLについてはTroels Arvin's answerを参照してください。*Troelsさん、私たちが引用できるリンクはありますか?
ここでは、私が最近書いた、動的なページング/ソートを可能にするOracle用のプログラムの一般的なバージョンを紹介します - HTH
-- p_LowerBound = first row # in the returned set; if second page of 10 rows,
-- this would be 11 (-1 for unbounded/not set)
-- p_UpperBound = last row # in the returned set; if second page of 10 rows,
-- this would be 20 (-1 for unbounded/not set)
OPEN o_Cursor FOR
SELECT * FROM (
SELECT
Column1,
Column2
rownum AS rn
FROM
(
SELECT
tbl.Column1,
tbl.column2
FROM MyTable tbl
WHERE
tbl.Column1 = p_PKParam OR
tbl.Column1 = -1
ORDER BY
DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 1, Column1, 'X'),'X'),
DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 1, Column1, 'X'),'X') DESC,
DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate),
DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate) DESC
))
WHERE
(rn >= p_lowerBound OR p_lowerBound = -1) AND
(rn <= p_upperBound OR p_upperBound = -1);