如何选择SQL数据库表中的第n行?
我有兴趣学习一些(理想情况下)从数据库表中选择第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,你有没有我们可以引用的链接?
在标准的可选部分中可以做到这一点,但很多数据库都支持他们自己的做法。
谈论这个和其他事情的一个非常好的网站是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