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:
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?
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.
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 <= p_upperBound OR p_upperBound = -1);