I'estou interessado em aprender algumas (idealmente) formas agnósticas de selecionar a na linha de uma tabela de banco de dados. Também seria interessante ver como isso pode ser alcançado usando a funcionalidade nativa das seguintes bases de dados:
Atualmente estou fazendo algo como o seguinte no SQL Server 2005, mas eu'estaria interessado em ver outras's abordagens mais agnósticas:
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
Crédito para o SQL acima: Firoz Ansari's Weblog
Update: Veja Troels Arvin's answer a respeito do padrão SQL. Troels, você tem algum link que possamos citar?
LIMIT n,1 doesn't funciona no MS SQL Server. Acho que é's praticamente a única grande base de dados que não't suporta essa sintaxe. Para ser justo, ela é't parte do padrão SQL, embora seja tão amplamente suportada que deveria ser. Em tudo excepto no SQL server o LIMIT funciona muito bem. Para SQL server, eu tenho't sido capaz de encontrar uma solução elegante.
Aqui's uma versão genérica de um sproc que escrevi recentemente para Oracle que permite a paginação/classificação dinâmica - 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);