使用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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值