当前位置: 代码迷 >> Sql Server >> 请问为什么不能这样写
  详细解决方案

请问为什么不能这样写

热度:15   发布时间:2016-04-24 09:50:49.0
请教为什么不能这样写
这样写是没问题的:
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添加索引有效吗?
------解决思路----------------------
row_number 不是最后才执行吗?执行时reallevel已经存在了啊,为什么不能这样写呢?
那也不是等其它结果出来才执行的啊,所以执行时reallevel不存在

case when判断不多的话,不会太慢

计算列可以添加索引
------解决思路----------------------
一个 select 子句中选取的字段/表达式是并列了,相互之间不能引用。
只有象 #1 一样嵌套之后,外层可以引用里层。

引用关系可以看成搭积木,只能在下层之上搭建,同层之间有搭建的需要就得分层。
  相关解决方案