小编典典

如何选择 SQL 数据库表中的第 n 行?

all

我有兴趣学习一些(理想情况下)从数据库表中选择第 n 行的与数据库无关的方法。看看如何使用以下数据库的本机功能来实现这一点也很有趣:

  • SQL 服务器
  • 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
的博客

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

与某些答案所声称的相反,SQL 标准并未就此主题保持沉默。

自 SQL:2003 以来,您已经能够使用“窗口函数”来跳过行并限制结果集。

在 SQL:2008 中,添加了一种稍微简单的方法,使用OFFSET *skip* ROWS FETCH FIRST *n* ROWS ONLY

就我个人而言,我不认为真的需要添加 SQL:2008,所以如果我是 ISO,我会将它排除在已经相当大的标准之外。


阅读 96

收藏
2022-03-17

共1个答案

小编典典

在标准的可选部分中有一些方法可以做到这一点,但是很多数据库都支持他们自己的方法。

一个非常好的讨论这个和其他事情的网站是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 中使用。

2022-03-17