使用ROW_NUMBER() OVER遇到的一点问题

 

Q:今天上课学习ROW_NUMBER() OVER的时候

SQL code

select *,row_number() over(order by productname) as rownumber
from products
--上面是正确的,然后我想的是从这个结果集在取10-20之间的数据,然后我书写如下:
select *,row_number() over(order by productname) as rownumber
from products
where rownumber between 10 and 20
--这样报错.然后又找资料看,找不个例子.然后我照那个例子改进
select* from
(select *,row_number() over(order by productname) as rownumber
from products)
as temp
where rownumber between 10 and 20
--这样就对了.


我想问,为什么非要在用子查询才能指定返回的范围呢?我第一种方法直接在取出来的结果集里取为什么不行呢?

 

A1:因为你直接where的时候,还不能用别名。。。 order by 就可以用。。。

 

A2:SQL code
select *,row_number() over(order by productname) as rownumber
from products
where (row_number() over(order by productname)) between 10 and 20 --修改过
--这样报错.然后又找资料看,找不个例子.然后我照那个例子改进
--因为他还不认识rownumber这个字段


懂了,这个select语句在这里是先执行from再执行where最后select..所以当执行到where的时候from出来的结果集里并没有rownumber这个东西.
是这样吧?

 

A3:

因为在products表中并不存在rownumber这个字段,系统在执行条件语句“where rownumber between 10 and 20”时,因为没有发现products表中有rownumber这个字段,所以就会报错了。
 

 

来源:http://topic.csdn.net/u/20090411/21/fcab1e5d-b4e6-4024-8190-e9f00e292ec7.html

你可能感兴趣的:(使用ROW_NUMBER() OVER遇到的一点问题)