我感兴趣的是从数据库表中选择第n行的一些(理想的)数据库不可知的方法。看看如何使用以下数据库的本机功能来实现这一点也很有趣:

SQL Server MySQL PostgreSQL SQLite 甲骨文

我目前正在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的Weblog的功劳

更新:参见Troels Arvin关于SQL标准的回答。Troels,你有我们可以引用的链接吗?


当前回答

我不确定其他的,但我知道SQLite和MySQL没有任何“默认”行排序。至少在这两种方言中,下面的代码片段从the_table中抓取了第15个条目,按添加的日期/时间排序:

SELECT * 
FROM the_table 
ORDER BY added DESC 
LIMIT 1,15

(当然,您需要添加一个DATETIME字段,并将其设置为条目添加的日期/时间…)

其他回答

在Sybase SQL Anywhere:

SELECT TOP 1 START AT n * from table ORDER BY whatever

别忘了ORDER BY,否则毫无意义。

在Oracle 12c中,你可以使用OFFSET..FETCH..带有ORDER BY的ROWS选项

例如,要从顶部获取第3条记录:

SELECT * 
FROM   sometable
ORDER BY column_name
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;

Oracle:

select * from (select foo from bar order by foo) where ROWNUM = x

ADD:

LIMIT n,1

这将把结果限制为从结果n开始的一个结果。

难以置信,你能找到一个SQL引擎执行这个…

WITH sentence AS
(SELECT 
    stuff,
    row = ROW_NUMBER() OVER (ORDER BY Id)
FROM 
    SentenceType
    )
SELECT
    sen.stuff
FROM sentence sen
WHERE sen.row = (ABS(CHECKSUM(NEWID())) % 100) + 1