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

我有兴趣学习一些(理想情况下)从数据库表中选择第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的博客

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


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

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


    PostgreSQL中的LIMIT / OFFSET语法是:

    SELECT
        *
    FROM
        mytable
    ORDER BY
        somefield
    LIMIT 1 OFFSET 20;
    

    本例选择第21行。 OFFSET 20告诉Postgres跳过前20条记录。 如果您未指定ORDER BY子句,则无法保证您将返回哪条记录,这很少有用。

    显然,SQL标准没有提到疯狂的窗口函数之外的极限问题,这就是为什么每个人都以不同的方式实现它。


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

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

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

    链接地址: http://www.djcxy.com/p/16885.html

    上一篇: How to select the nth row in a SQL database table?

    下一篇: select statement inside insert statement in sql returns multiple rows