Ich bin daran interessiert, einige (idealerweise) datenbankunabhängige Möglichkeiten zur Auswahl der nten Zeile aus einer Datenbanktabelle zu lernen. Es wäre auch interessant zu sehen, wie dies mit der nativen Funktionalität der folgenden Datenbanken erreicht werden kann:
Ich mache derzeit so etwas wie das Folgende in SQL Server 2005, aber ich wäre daran interessiert, andere agnostische Ansätze zu sehen:
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
Dank für das obige SQL: Firoz Ansari's Weblog
Update: Siehe Troels Arvin's Antwort bezüglich des SQL-Standards. Troels, hast du irgendwelche Links, die wir zitieren können?
ADD:
LIMIT n,1
Damit werden die Ergebnisse ab Ergebnis n auf ein Ergebnis begrenzt.
LIMIT n,1 funktioniert nicht in MS SQL Server. Ich glaube, es ist so ziemlich die einzige große Datenbank, die diese Syntax nicht unterstützt. Fairerweise muss man sagen, dass sie nicht Teil des SQL-Standards ist, obwohl sie so weit verbreitet ist, dass sie es sein sollte. In allen Datenbanken außer SQL Server funktioniert LIMIT hervorragend. Für SQL Server konnte ich noch keine elegante Lösung finden.
Hier ist eine generische Version eines Sprocs, das ich kürzlich für Oracle geschrieben habe und das dynamisches Paging/Sortieren ermöglicht - 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);