Kako izbrati n-to vrstico v tabeli podatkovne zbirke SQL?

Zanima me, kako se naučiti nekaj (idealno) podatkovni bazi prijaznih načinov izbire nte vrstice iz tabele v podatkovni bazi. Prav tako bi bilo zanimivo videti, kako je to mogoče doseči z uporabo izvirnih funkcij naslednjih podatkovnih zbirk:

  • SQL Server
  • MySQL
  • PostgreSQL
  • SQLite
  • Oracle

Trenutno delam nekaj podobnega v SQL Serverju 2005, vendar bi me zanimalo, če bi videli bolj agnostične pristope drugih:

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

Zasluge za zgornji SQL: Firoz Ansari's Weblog

Update: Glej Troels Arvin's answer glede standarda SQL. Troels, imaš kakšne povezave, ki jih lahko navedemo?

ADD:

LIMIT n,1

To bo omejilo rezultate na en rezultat, začenši z rezultatom n.

Komentarji (0)

LIMIT n,1 ne deluje v strežniku MS SQL Server. Mislim, da je to edina večja podatkovna zbirka, ki ne podpira te sintakse. Če smo pošteni, ta sintaksa ni del standarda SQL, čeprav je tako široko podprta, da bi morala biti. V vsem, razen v strežniku SQL, LIMIT deluje odlično. Za strežnik SQL nisem našel elegantne rešitve.

Komentarji (2)

Tukaj je splošna različica sproc-a, ki sem ga pred kratkim napisal za Oracle in omogoča dinamično listanje/razvrščanje - 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 
Komentarji (0)