【问题标题】:how to select first N rows from a table in T-SQL?如何从 T-SQL 中的表中选择前 N 行?
【发布时间】: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 () 时也是如此:stackoverflow.com/a/16610654/6910

标签: sql database


【解决方案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 中起作用。
          猜你喜欢
          • 2012-02-27
          • 2021-10-20
          • 2011-03-22
          • 1970-01-01
          • 2013-02-06
          • 2016-08-23
          • 1970-01-01
          • 1970-01-01
          • 2010-10-25
          相关资源
          最近更新 更多