我有兴趣学习一些(理想情况下)从数据库表中选择第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标准,请参见Troels Arvin的答案 。 Troels,您有我们可以引用的任何链接吗?
#1楼
对于SQL Server,按行号排序的通用方法如下:
SET ROWCOUNT @row --@row = the row number you wish to work on.
例如:
set rowcount 20 --sets row to 20th row
select meat, cheese from dbo.sandwich --select columns from table at 20th row
set rowcount 0 --sets rowcount back to all rows
这将返回第20行的信息。 请确保之后再放入行计数0。
#2楼
这是您的困惑的快速解决方案。
SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1
在这里,您可以通过填充N = 0来获得最后一行,通过N = 1来获得倒数第二行,通过填充N = 3来获得倒数第四行,依此类推。
这是面试中非常普遍的问题,这是非常简单的答案。
更进一步,如果您想要金额,ID或某些数字排序顺序,那么您可能不希望在MySQL中使用CAST函数。
SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1
在这里,通过填充N = 4,您将能够从CART表中获得最高金额的第五个最后记录。 您可以适合您的字段和表名称并提出解决方案。
#3楼
SQL 2005及更高版本具有此内置功能。 使用ROW_NUMBER()函数。 对于具有<>样式浏览的网页而言,它非常有用:
句法:
SELECT
*
FROM
(
SELECT
ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum,
*
FROM
Table_1
) sub
WHERE
RowNum = 23
#4楼
加:
LIMIT n,1
这会将结果限制为从结果n开始的一个结果。
#5楼
LIMIT n,1在MS SQL Server中不起作用。 我认为这只是唯一不支持该语法的主要数据库。 公平地说,它不是SQL标准的一部分,尽管它得到了应有的广泛支持。 除了SQL Server之外,LIMIT在所有情况下都非常有效。 对于SQL Server,我一直找不到理想的解决方案。