Comment sélectionner la nième ligne dans une table de base de données SQL ?

Je suis intéressé par l'apprentissage de certains moyens (idéalement) indépendants de la base de données pour sélectionner la nième ligne d'une table de base de données. Il serait également intéressant de voir comment cela peut être réalisé en utilisant la fonctionnalité native des bases de données suivantes :

  • SQL Server
  • MySQL
  • PostgreSQL
  • SQLite
  • Oracle

Je fais actuellement quelque chose comme ce qui suit dans SQL Server 2005, mais je serais intéressé de voir les approches plus agnostiques des autres :

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

Crédit pour le SQL ci-dessus : Blog de Firoz Ansari

Mise à jour: Voir la réponse de [Troels Arvin][2] concernant le standard SQL. Troels, avez-vous des liens que nous pouvons citer?

[2] : https://stackoverflow.com/questions/16568/how-to-select-the-nth-row-in-a-sql-database-table#42765

ADD :

LIMIT n,1

Cela limitera les résultats à un seul résultat à partir du résultat n.

Commentaires (0)

LIMIT n,1 ne fonctionne pas dans MS SQL Server. Je pense que c&#8217est à peu près la seule grande base de données qui ne prend pas en charge cette syntaxe. Pour être honnête, elle ne fait pas partie de la norme SQL, bien qu'elle soit si largement supportée qu'elle devrait l'être. À l'exception du serveur SQL, LIMIT fonctionne parfaitement. Pour le serveur SQL, je n&#8217ai pas réussi à trouver une solution élégante.

Commentaires (2)

Voici une version générique d'un sproc que j'ai récemment écrit pour Oracle et qui permet une pagination/tri dynamique.


-- 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 
Commentaires (0)