¿Cómo seleccionar la enésima fila en una tabla de base de datos SQL?

Estoy interesado en aprender algunas formas (idealmente) agnósticas de la base de datos para seleccionar la nª fila de una tabla de la base de datos. También sería interesante ver cómo se puede lograr esto utilizando la funcionalidad nativa de las siguientes bases de datos:

  • SQL Server
  • MySQL
  • PostgreSQL
  • SQLite
  • Oracle

Actualmente estoy haciendo algo como lo siguiente en SQL Server 2005, pero me interesaría ver otros enfoques más agnósticos:

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

Crédito para el SQL anterior: Firoz Ansari's Weblog

Actualización: Ver Troels Arvin's answer en relación con el estándar SQL. *Troels, ¿tienes algún enlace que podamos citar?

ADD:

LIMIT n,1

Eso limitará los resultados a un resultado a partir del resultado n.

Comentarios (0)

LIMIT n,1 no funciona en MS SQL Server. Creo que es la única base de datos importante que no admite esa sintaxis. Para ser justos, no es parte del estándar SQL, aunque está tan ampliamente soportado que debería serlo. En todo, excepto en SQL server, LIMIT funciona muy bien. Para SQL server, no he podido encontrar una solución elegante.

Comentarios (2)

Aquí hay una versión genérica de un sproc que escribí recientemente para Oracle que permite la paginación/ordenación dinámica - 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 
Comentarios (0)