【问题标题】:Skip first row in SQL Server 2005?在 SQL Server 2005 中跳过第一行?
【发布时间】:2011-08-21 11:05:53
【问题描述】:

我们可以从 SQL Server 中选择Top 10Select Top 'N' 行。

但是有什么办法可以跳过top结果的第一行吗?

我的意思是我从select top 5 得到结果,然后我跳过第一行,只得到接下来的 4 行?

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql


    【解决方案1】:

    您可以使用OVER 子句和排名功能。您不能直接对此进行过滤,因此您需要使用子查询或公用表表达式,下面的示例使用后者。

    DECLARE @MyTable TABLE 
    (
        ID INT,
        Name VARCHAR(15)
    );
    INSERT INTO @MyTable VALUES (1, 'Alice');
    INSERT INTO @MyTable VALUES (2, 'Bob');
    INSERT INTO @MyTable VALUES (3, 'Chris');
    INSERT INTO @MyTable VALUES (4, 'David');
    INSERT INTO @MyTable VALUES (5, 'Edgar');
    
    WITH people AS 
    (
        SELECT ID, Name, ROW_NUMBER() OVER (ORDER BY ID) RN
        FROM @MyTable
    )
    SELECT ID, Name
    FROM people
    WHERE RN > 1;
    

    在 SQL Server 的下一版本(代号 Denali)中将更好地支持带有 OFFSETFETCH 关键字的分页。

    【讨论】:

    • 太好了……我没想到这个方向。我试图选择前 5 名,然后我试图用“跳过”这个词跳过第一个......非常感谢...... :-)
    • +1 提到它是一个排名功能 - 这使它成为一个更有用的答案
    【解决方案2】:

    你可以这样做:

    SELECT
        *
    FROM (
            SELECT      
                row_number() OVER (ORDER BY ID DESC) AS [rownum],
                *
            FROM
                tbl
    ) T
    WHERE 
        rownum BETWEEN (2) AND (5)
    

    更新:

    更新为您的价值观。

    更新 2:

    更正了缺少子查询的错误。感谢 Chris Diver 指出这一点。

    【讨论】:

    • 是的。我在我的 sql 中执行时确实正确,但在这里忘记提及了。 :-)
    • 我在另一个子查询中使用了它,效果很好!在这种情况下,另一个 ;WITH... 解决方案不起作用。
    【解决方案3】:

    您正在寻找的是术语分页。 像这样:http://www.15seconds.com/issue/070628.htm

    【讨论】:

      【解决方案4】:

      类似这样的:

      -- Test table
      declare @T table(ID int);
      
      -- Add test data
      insert into @T 
      select 1 union all
      select 2 union all
      select 3 union all
      select 4 union all
      select 5 union all
      select 6;
      
      -- Query using row_number() over(...)
      -- to get rows 2 - 5
      select T.ID
      from (
              select *,
                     row_number() over(order by ID) as rn
              from @T       
           ) as T
      where T.rn between 2 and 5;
      

      【讨论】:

        猜你喜欢
        • 2019-05-21
        • 2010-09-09
        • 1970-01-01
        • 2021-12-26
        • 2014-06-07
        • 2013-08-17
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多