我有兴趣学习一些(理想情况下)从数据库表中选择第 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 的博客
更新: 请参[Troels Arvin关于 SQL 标准的回答。Troels,你有我们可以引用的链接吗?
与某些答案所声称的相反,SQL 标准并未就此主题保持沉默。
自 SQL:2003 以来,您已经能够使用“窗口函数”来跳过行并限制结果集。
在 SQL:2008 中,添加了一种稍微简单的方法,使用OFFSET *skip* ROWS FETCH FIRST *n* ROWS ONLY
OFFSET *skip* ROWS FETCH FIRST *n* ROWS ONLY
就我个人而言,我不认为真的需要添加 SQL:2008,所以如果我是 ISO,我会将它排除在已经相当大的标准之外。
在标准的可选部分中有一些方法可以做到这一点,但是很多数据库都支持他们自己的方法。
一个非常好的讨论这个和其他事情的网站是http://troels.arvin.dk/db/rdbms/#select- limit。
基本上,PostgreSQL 和 MySQL 支持非标准:
SELECT... LIMIT y OFFSET x
Oracle、DB2 和 MSSQL 支持标准窗口函数:
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber, columns FROM tablename ) AS foo WHERE rownumber <= n
(我只是从上面链接的站点复制的,因为我从不使用这些数据库)
更新: 从 PostgreSQL 8.4 开始,支持标准窗口函数,因此希望第二个示例也适用于 PostgreSQL。
更新: SQLite 在 2018-09-15 版本 3.25.0 中添加了窗口函数支持,因此这两种形式也可以在 SQLite 中使用。