【问题标题】:how to use rownumber to write a paging query in SQL [duplicate]如何使用rownumber在SQL中编写分页查询[重复]
【发布时间】:2013-06-27 20:04:20
【问题描述】:

我知道如何使用“选择顶部”来编写分页查询,但我不知道如何使用 rownumber 来编写它。 谁能告诉我?谢谢!

【问题讨论】:

标签: sql sql-server


【解决方案1】:
select * from (
    select ROW_NUMBER() over (order by SalesOrderDate desc) as rn, *
    from sales.salesorderheader
) as x
where rn between @start and @start + @page_size

这应该可以解决问题。

【讨论】:

  • 但他想将订单作为参数传递
  • @Hogan - 你是如何辨别的?在问题正文或标题中看不到任何提及。
  • 什么?不知道动态 order by 是怎么变成“知道怎么用“select top”写分页查询,但是不知道怎么用rownumber写。谁能告诉我?谢谢!”
  • 其实我是想测试一下我的问题能不能用英文很好的表达出来。我的母语不是英语。这是我第一次来这里——一个解决编码问题的好地方。我会经常光顾这里。谢谢大家。
  • 小心,between 会包含极端值,所以它会返回 $page_size + 1 条记录而不是 $page_size。只有当 start = 0 时才会返回 $page_size 条记录。所以如果条件是:where rn > $start and rn <= ($start + $page_size).
【解决方案2】:

尝试以下泛化查询:

DECLARE @Start INT = 0
DECLARE @page_size INT = 10
DECLARE @Orderby VARCHAR(max) = 'SalesOrderDate'
DECLARE @Order VARCHAR(max) = 'desc';

WITH temp
     AS (SELECT case when 'SalesOrderDate' then ROW_NUMBER() OVER (ORDER BY SalesOrderDate) 
                                            ELSE ROW_NUMBER() OVER (ORDER BY id) END AS rn,
                *
         FROM   sales.salesorderheader)
SELECT *
FROM   (SELECT row_number() OVER(ORDER BY CASE 
                                          WHEN @Order = 'asc' 
                                          THEN rn 
                                          ELSE -rn 
                                          END) AS finalorder,
               *
        FROM   temp) AS x
WHERE  finalorder BETWEEN @start AND @start + @page_size 

【讨论】:

  • 这个答案太可怕了。
  • SalesOrderDateid 极不可能是相同的数据类型。如果 Dateint 这将不起作用(并且它将无法使用任何索引来避免排序)
  • @Hiren Dhaduk -- 正如 Martin 所说,最好的方法是 IF 语句
  • 不,我找到了更通用的解决方案。让我修改我的答案。
  • 检查一下,我们在我们的一个项目中使用了这种类型的查询。它会正常工作。
猜你喜欢
  • 2018-07-05
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多