我正在尝试选择第3-5行:
SELECT *
FROM Finance_User
ORDER BY email DESC我本来有:
SELECT
ROW_NUMBER() OVER (ORDER BY email DESC) AS RowNum, *
FROM
Finance_User
WHERE
RowNum BETWEEN 3 AND 5但是,由于RowNum是一个无效的列,所以这是无效的。
相反,我做了以下几点:
WITH OrderedUsers AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY email DESC) AS RowNum, *
FROM
Finance_User
)
SELECT *
FROM OrderedUsers
WHERE RowNum BETWEEN 3 AND 5这个很好用。然而,我担心这可能会有性能问题,因为它似乎是从表中挑选两次?
发布于 2019-04-05 22:13:22
带有CTE (或子查询)的ROW_NUMBER()不会扫描表两次。但是,使用窗口函数可能会对RDBMS产生额外的处理。
您可以在启动Server 2012的ORDER BY ... OFFSET ... FETCH ...中获得相同的结果,这些结果专门用于分页结果集:
SELECT *
FROM Finance_User
ORDER BY email DESC
OFFSET 2 ROWS FETCH NEXT 3 ROWS ONLY从文件中:
我们建议您使用偏移量和FETCH子句而不是TOP子句来实现查询分页解决方案,并限制发送到客户端应用程序的行数。
发布于 2019-04-05 22:13:48
你的查询很好。
WITH AS子句是一个公共表表达式,这意味着以后可以重用该查询,如果需要和可能的话,应该缓存该查询。因此,“从表中选择两次”不应该有任何问题。
使用此查询可以获得相同的结果:
SELECT * from
(SELECT ROW_NUMBER() OVER (ORDER BY email DESC) AS RowNum, * FROM Finance_User)
where RowNum between 3 and 5最后,您可以始终检查执行计划并确保执行计划。
https://stackoverflow.com/questions/55543904
复制相似问题