如何从 T-SQL 中的表中选择前 N 行?
Posted
技术标签:
【中文标题】如何从 T-SQL 中的表中选择前 N 行?【英文标题】:how to select first N rows from a table in T-SQL? 【发布时间】:2009-10-11 22:57:53 【问题描述】:有没有什么方法可以选择,例如,在 T-SQL(工作 MSSQL)中选择表的前 10 行? 我想我在 Oracle 中看到了一些定义为 rownum 元变量的东西,以下列方式使用
从其中 rownum 但是 MSSQL 呢?【问题讨论】:
另外值得注意的是,如果你想在Oracle中取top 10的结果,你必须写select * from (select * from Users order by UserName) where rownum @Lukled 在 mssql 中使用 row_number() over () 时也是如此:***.com/a/16610654/6910 【参考方案1】:select top(@count) * from users
如果@count
是常量,可以去掉括号:
select top 42 * from users
(后者也适用于 SQL Server 2000,而前者至少需要 2005)
【讨论】:
【参考方案2】:您可以使用 Microsoft 的 row_number() 函数来决定要返回哪些行。这意味着您不仅限于前 X 个结果,还可以获取页面。
SELECT *
FROM (SELECT row_number() over (order by UserID) AS line_no, *
FROM dbo.User) as users
WHERE users.line_no < 10
OR users.line_no BETWEEN 34 and 67
但您必须嵌套原始查询,否则您会收到一条错误消息,告诉您无法按照理想世界中可能应该能够做到的方式做您想做的事情。
Msg 4108, Level 15, State 1, Line 3
Windowed functions can only appear in the SELECT or ORDER BY clauses.
【讨论】:
【参考方案3】:SELECT TOP 10 *
FROM Users
请注意,如果您未指定 ORDER BY
子句,则可能会返回任何 10 行,因为“前 10 行”在您告诉数据库要使用的顺序之前没有任何意义。
【讨论】:
+1 表示order by
的区别。 SQL Server从不保证没有order by
的订单。【参考方案4】:
你也可以使用 rowcount,但 TOP 可能更好更干净,因此对 Mehrdad 投了赞成票
SET ROWCOUNT 10
SELECT * FROM dbo.Orders
WHERE EmployeeID = 5
ORDER BY OrderDate
SET ROWCOUNT 0
【讨论】:
这是一种在 SQL Server 2005 之前的版本中参数化前 N 行的方法【参考方案5】:试试这个。
declare @topval int
set @topval = 5 (customized value)
SELECT TOP(@topval) * from your_database
【讨论】:
【参考方案6】:SELECT TOP 10 * FROM TABLE_NAME ORDER BY ORDERED_UNIQUE_COLUMN DESC
ORDERED_UNIQUE_COLUMN 可以是递增的主键或时间戳
【讨论】:
【参考方案7】:试试这个:
SELECT * FROM USERS LIMIT 10;
【讨论】:
请记住,这在 MSSQL 中不起作用,但在 mysql 中起作用。以上是关于如何从 T-SQL 中的表中选择前 N 行?的主要内容,如果未能解决你的问题,请参考以下文章