Ενδιαφέρομαι να μάθω μερικούς (ιδανικούς) τρόπους επιλογής της n-οστής γραμμής από έναν πίνακα βάσης δεδομένων. Θα ήταν επίσης ενδιαφέρον να δούμε πώς μπορεί να επιτευχθεί αυτό χρησιμοποιώντας την εγγενή λειτουργικότητα των ακόλουθων βάσεων δεδομένων:
Αυτή τη στιγμή κάνω κάτι παρόμοιο με το ακόλουθο σε SQL Server 2005, αλλά θα με ενδιέφερε να δω άλλες προσεγγίσεις:
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
Πίστωση για την παραπάνω SQL: Firoz Ansari's Weblog
Ενημέρωση: Βλέπε Troels Arvin's answer σχετικά με το πρότυπο SQL. Troels, έχεις κάποιο σύνδεσμο που μπορούμε να παραθέσουμε;
ADD:
LIMIT n,1
Αυτό θα περιορίσει τα αποτελέσματα σε ένα αποτέλεσμα ξεκινώντας από το αποτέλεσμα n.
Το LIMIT n,1 δεν λειτουργεί στον MS SQL Server. Νομίζω ότι είναι η μόνη μεγάλη βάση δεδομένων που δεν υποστηρίζει αυτή τη σύνταξη. Για να είμαστε δίκαιοι, δεν αποτελεί μέρος του προτύπου SQL, αν και υποστηρίζεται τόσο ευρέως που θα έπρεπε να υποστηρίζεται. Σε οτιδήποτε άλλο εκτός από τον SQL server το LIMIT λειτουργεί άψογα. Για τον SQL server, δεν μπόρεσα να βρω μια κομψή λύση.
Εδώ είναι μια γενική έκδοση ενός sproc που έγραψα πρόσφατα για την Oracle που επιτρέπει τη δυναμική σελιδοποίηση/ταξινόμηση - 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);