必须掌握的Row_Number

接下来我们将给大家介绍如何分页显示后台数据,但是在这之前我需要先给大家介绍一下SQL Server的Row_Number函数。

Row_Number函数让我们分页显示后台变得非常方便。

一般用户对于Row_Number函数的使用会比较迷糊,不过通过本节的学习,你会发现Row_Number其实很简单。

一个例子

假定我们需要按照日期降序加载订单表数据,每页10行,加载第8页,我们可以在Foxtable的SQL窗口测试以下各步骤的Select语句。

1、按照常规写出最简单的Select语句:

Select * From {订单}

这是显示的结果是:

2、RowNumber函数用于按指定的列排序,来生成一个序号列,语法为:

Row_Number() Over(Order by 排序列) As 序号列

可变的只有排序列和序号列名,默认是升序,如果需要降序,在排序列后面加上DESC参数即可。

现在将我们的Select语句改写为:

Select Row_Number() Over(Order by 日期 Desc) As 序号, * From {订单}

显示的结果如下图,可以看到增加了一个序号列,序号是根据日期按照降序编排的。

3、现在我们可以将上面的Select语句当作一个表来看待,我们从这个表提取数据:

Select * From (Select Row_Number() Over(Order by 日期 Desc) As 序号, * From {订单}) As tmp

上述语句分三部分,中间括起来的蓝色部分可以理解为一个临时表,我们需要给这个临时表取个名字,后面这段红色部分将这个临时表取名为"tmp"

现在的显示结果没有变化:

4、现在是最后一步,每页10行,第8页的数据的序号列范围为70到80,我们将Select语句改为:

Select * From (Select Row_Number() Over(Order by 日期 Desc) As 序号, * From {订单}) As tmp Where 序号 >=71 And 序号 <= 80

显示结果为:

上图就是按照日期降序加载订单表,每页10行,加载第8页的结果。

最终的Select语句看起来有点复杂:

Select * From
(Select Row_Number() Over(Order by 日期 Desc) As 序号, * From {订单}) As tmp Where 序号 >=71 And 序号 <= 80


但是你可以理解为:


Select * From
tmp Where 序号 >=71 And 序号 <= 80


而tmp是个临时表,是通过以下语句生成的:


(Select Row_Number() Over(Order by 日期 Desc) As 序号, * From {订单})
As tmp

注意临时表的Select语句必须用圆括号括起来。


本页地址:http://www.foxtable.com/mobilehelp/topics/0155.htm