如何从 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 行?的主要内容,如果未能解决你的问题,请参考以下文章

如何从T-SQL中的排序表中从第M行开始获取N行

如何从雪花数据库中的表中删除前 N 条记录

如何从每组中获得前 1 行? (T-SQL)

从sql中的表中检索前n个字母[重复]

如何从 T-SQL 存储过程返回表

如何在 Navicat 复制和粘贴数据