【问题标题】:Pagination in SQL ServerSQL Server 中的分页
【发布时间】:2010-12-17 23:20:40
【问题描述】:

我如何限制查询结果(在我的情况下大约为 60K 行)并仅从 X 行到 Y 行进行选择?

如果我使用 ROW_NUMBER(),我不喜欢我的查询,因为它涉及 2 个选择查询 .. 一个用于返回行,一个用于选择我需要的部分

更新:

这是我现在使用的查询:

SELECT  *
FROM    (
        SELECT  row_number() OVER (ORDER BY E.LastChangeDate DESC) AS row, E.*, U.[DisplayName] AS EntryCreatorDisplayName, U.[Email] AS EntryCreatorEmail
        FROM    entries e
        INNER JOIN
                users u
        ON      e.fk_user= u.id
        WHERE   e.EntryRank = 2
                AND u.Administrator = 1
        ) as TableWithRows
WHERE   (row >= 31 AND row <= 60)

【问题讨论】:

  • 表格中是否有标识列?
  • MS SQL 2005,是的,我有一个标识列,因为我在选择中的仲裁字段上有一个订单

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


【解决方案1】:
WITH    q AS
        (
        SELECT  TOP (@Y) m.*, ROW_NUMBER() OVER (ORDER BY mycol) AS rn
        FROM    mytable m
        ORDER BY
                mycol
        )
SELECT  *
FROM    q
WHERE   rn >= @X

SQL Server 2000:

SELECT  *
FROM    (
        SELECT  TOP (@Y - @X) *
        FROM    (
                SELECT  TOP (@X) *
                FROM    mytable
                ORDER BY
                        mycol
                ) q
        ORDER BY
                mycol DESC
        ) q2
ORDER BY
        mycol

【讨论】:

  • 我相信这仅限于 SQL Server 2005 及更高版本
  • @CodeByMoonlight,抱歉在我看到你之前添加了该评论
  • 我使用了这种方法,但这涉及到 2 个查询,一个用于获取所有需要的行(大约 60K),一个用于将它们限制为仅 30 个(在我的情况下)。第一个选择需要很长时间才能执行,这会损害我的整体表现。
  • @Paul: 你能发布你的问题吗?可能查询本身需要一些改进。
  • SELECT * FROM ( SELECT row_number() OVER (ORDER BY E.LastChangeDate DESC) AS row, E.*, U.[DisplayName] AS EntryCreatorDisplayName,U.[Email] AS EntryCreatorEmail 来自条目 e inner join users u on e.fk_user= u.id WHERE e.EntryRank=2 AND u.Administrator = 1 ) as TableWithRows WHERE (row >= 31 AND row
【解决方案2】:

【讨论】:

    【解决方案3】:

    目前无权访问 SQL,但这样的东西可以吗?

    SELECT tempid=IDENTITY(int, 1, 1), * FROM tbl WHERE tempid >= @x AND tempid <= @y
    

    【讨论】:

    • 这只有在我将选择插入临时表时才有效(这是 SQL 2005 行号之前的已知解决方法)
    【解决方案4】:

    我对 MSSQL 不太熟悉,但是在 MySQL 中,我会做这样的事情:

    LIMIT 50, 10
    

    其中 10 是要跳过的记录数,50 是要取的记录数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-28
      • 2011-07-17
      • 2016-05-21
      • 2015-09-29
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      相关资源
      最近更新 更多