Come selezionare l'ennesima riga in una tabella di database SQL?

Sono interessato a conoscere alcuni modi (idealmente) agnostici di selezionare la nesima riga da una tabella di database. Sarebbe anche interessante vedere come questo può essere ottenuto utilizzando le funzionalità native dei seguenti database:

  • SQL Server
  • MySQL
  • PostgreSQL
  • SQLite
  • Oracle

Attualmente sto facendo qualcosa come il seguente in SQL Server 2005, ma sarei interessato a vedere altri approcci più agnostici:

WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000

Credito per l'SQL di cui sopra: Firoz Ansari's Weblog

Aggiornamento: Vedi Troels Arvin'risposta per quanto riguarda lo standard SQL. *Troels, hai qualche link che possiamo citare?

ADD:

LIMIT n,1

Questo limiterà i risultati ad un solo risultato a partire dal risultato n.

Commentari (0)

LIMIT n,1 non funziona in MS SQL Server. Penso che sia l'unico grande database che non supporta questa sintassi. Per essere onesti, non fa parte dello standard SQL, anche se è così ampiamente supportato che dovrebbe esserlo. In tutto tranne che in SQL server LIMIT funziona benissimo. Per SQL server, non sono stato in grado di trovare una soluzione elegante.

Commentari (2)

Ecco una versione generica di uno sproc che ho scritto recentemente per Oracle che permette l'impaginazione/ordinamento dinamico - 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 
Commentari (0)