请教为什么不能这样写

薄荷红茶 2014-10-23 09:35:21
这样写是没问题的:
select row_number() over(order by (case when vipendtime<getdate() then 0 else viplevel end) desc)  rownum,id, reallevel=(case when vipendtime<getdate() then 0 else viplevel end) from T_user 


这样写就提示找不到列reallevel

select row_number() over(order by reallevel desc) rownum,id, reallevel=(case when endtime<getdate() then 0 else viplevel end) from T_user 


row_number 不是最后才执行吗?执行时reallevel已经存在了啊,为什么不能这样写呢?第一种写法case when是不是执行两遍,效率会不会低?有没有好方法处理吗(在不添加计算列的情况下)?如果添加计算列这个reallevel添加索引有效吗?
...全文
153 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-10-23
  • 打赏
  • 举报
回复
row_number() 是一个函数,语句分析的时候是当成普通函数看待的,函数就是不能引用同级的字段/表达式。
薄荷红茶 2014-10-23
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
一个 select 子句中选取的字段/表达式是并列了,相互之间不能引用。 只有象 #1 一样嵌套之后,外层可以引用里层。 引用关系可以看成搭积木,只能在下层之上搭建,同层之间有搭建的需要就得分层。
还是有点不明白 看这个例子 是可以引用的 我的理解是这个例子中 先查询字段 再排序 而上面的例子中(而row_number() )也是先查询再排序 为什么就不行了呢?
select reallevel = (case when vipendtime<GETDATE() then 0 else viplevel end) from T_test order by reallevel desc
薄荷红茶 2014-10-23
  • 打赏
  • 举报
回复
引用 1 楼 fredrickhu 的回复:
可以在外面再嵌套一层。
select 
  row_number() over(order by  reallevel desc)  rownum,*
from
(
select 
id, 
reallevel=(case when vipendtime<getdate() then 0 else viplevel end) 
from 
T_user ) as t
这样嵌套(1) 和 我原来的方法写两遍(2) 以及 添加计算列(3) 在百万左右的数据量时效率上哪个高?
IFocusYou 2014-10-23
  • 打赏
  • 举报
回复
SQL语句的执行顺序,select比较靠后,所以要嵌套一层
Tiger_Zhao 2014-10-23
  • 打赏
  • 举报
回复
一个 select 子句中选取的字段/表达式是并列了,相互之间不能引用。
只有象 #1 一样嵌套之后,外层可以引用里层。

引用关系可以看成搭积木,只能在下层之上搭建,同层之间有搭建的需要就得分层。
还在加载中灬 2014-10-23
  • 打赏
  • 举报
回复
row_number 不是最后才执行吗?执行时reallevel已经存在了啊,为什么不能这样写呢? 那也不是等其它结果出来才执行的啊,所以执行时reallevel不存在 case when判断不多的话,不会太慢 计算列可以添加索引
--小F-- 2014-10-23
  • 打赏
  • 举报
回复
可以在外面再嵌套一层。
select 
  row_number() over(order by  reallevel desc)  rownum,*
from
(
select 
id, 
reallevel=(case when vipendtime<getdate() then 0 else viplevel end) 
from 
T_user ) as t

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧