Jeg er interessert i å lære noen (ideelt sett) databaseagnostiske måter å velge n rad fra en databasetabell. Det ville også være interessant å se hvordan dette kan oppnås ved hjelp av den opprinnelige funksjonaliteten til følgende databaser:
Jeg gjør for tiden noe som følgende i SQL Server 2005, men jeg er interessert i å se andres mer agnostiske tilnærminger:
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
Kreditt for ovennevnte SQL: Firoz Ansari&# 39s Weblog
Oppdatering: Se Troels Arvins svar angående SQL-standarden. *Troels, har du noen lenker vi kan sitere?
LIMIT n,1 fungerer ikke i MS SQL Server. Jeg tror det er omtrent den eneste store databasen som ikke støtter den syntaksen. For å være rettferdig er det ikke en del av SQL-standarden, selv om den støttes så bredt at den burde være det. I alt unntatt SQL server fungerer LIMIT bra. For SQL server har jeg ikke klart å finne en elegant løsning.
Her&# 39 er en generisk versjon av en sproc jeg nylig skrev for Oracle som muliggjør dynamisk personsøking / sortering - 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);