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 :
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
LIMIT n,1 ne fonctionne pas dans MS SQL Server. Je pense que c’est à 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’ai pas réussi à trouver une solution élégante.
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 <= p_upperBound OR p_upperBound = -1);