SQL Server中的分页查询

3

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

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

更新:

这是我现在使用的查询:

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)

你的表中有一个自增列吗? - Irwin M. Fletcher
MS SQL 2005,是的,我有一个自增列,因为我在我的select中使用了一个任意字段的order by。 - Paul
4个回答

6
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及以上版本。 - Irwin M. Fletcher
@CodeByMoonlight,抱歉在看到你的评论之前添加了那个评论。 - Irwin M. Fletcher
我使用了这种方法,但它涉及到两个查询,一个是获取所有所需的行(约60K),另一个是将它们限制为仅30行(在我的情况下)。第一个选择需要很长时间才能执行,这会影响我的整体性能。 - Paul
@Paul:你能发一下你的查询吗?也许查询本身需要一些改进。 - Quassnoi
选择 * 从 ( 选择 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)来自条目表的查询返回约60K行,需要大约3秒钟。
- Paul
@Paul:尝试像我第一个查询那样添加“TOP”。 - Quassnoi

0

目前无法访问SQL,但是类似这样的东西会起作用吗?

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

这只在我将选择插入临时表中才有效(这是 SQL 2005 rownumber 之前已知的解决方法)。 - Paul

0

-1

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

LIMIT 50, 10

10 是要跳过的记录数,而 50 是要获取的记录数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接