sql where后面不能使用别名吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql where后面不能使用别名吗相关的知识,希望对你有一定的参考价值。

--这个sql语句为什么会错误
select top 2 "Temp".*, "D".dname "DeptName", "S".grade "SalGrade"
from
(
select "E".deptno "deptNumber",floor(avg("E".sal)) "avgSal",count(*) "PersonNumber"
from emp "E"
where "E".sal > 2000
group by "E".deptno
order by "Temp"."avgSal" desc --这里的差别
) "Temp"
join salgrade "S" on "Temp"."avgSal" >= "S".losal and "Temp"."avgSal" <= "S".hisal
join dept "D" on "D".deptno = "Temp"."deptNumber"

--这个sql语句为什么会正确
select top 2 "Temp".*, "D".dname "DeptName", "S".grade "SalGrade"
from
(
select "E".deptno "deptNumber",floor(avg("E".sal)) "avgSal",count(*) "PersonNumber"
from emp "E"
where "E".sal > 2000
group by "E".deptno
) "Temp"
join salgrade "S" on "Temp"."avgSal" >= "S".losal and "Temp"."avgSal" <= "S".hisal
join dept "D" on "D".deptno = "Temp"."deptNumber"
order by "Temp"."avgSal" desc --这里的差别

select top 2 "Temp".*, "D".dname "DeptName", "S".grade "SalGrade"
from
(
select "E".deptno "deptNumber",floor(avg("E".sal)) "avgSal",count(*) "PersonNumber"
from emp "E"
where "E".sal > 2000
group by "E".deptno

) "Temp"
join salgrade "S" on "Temp"."avgSal" >= "S".losal and "Temp"."avgSal" <= "S".hisal
join dept "D" on "D".deptno = "Temp"."deptNumber"
order by "Temp"."avgSal" desc

//注意:上面两个语句的差别是 order by "avgSal" desc 放在子select末尾还是外部select末尾

错误消息:
消息 1033,级别 15,状态 1,第 10 行
除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。

你用了子查询,子查询里是不能用order by的。但是,如果用了TOP,可以用order by。因为,使用order by,可以改变查询结果。如select top 1 * from tn order by id,得到最前一条;select top 1 * from tn order by id desc,得到最后一条追问

是的,但是我想知道为什么,完整说出即采纳

追答

数据在数据库中存储在数据表的空间中,是有顺序的。子查询得到的结果,只是一个结果而已,加不加order by,对存储没有帮助。而子查询只是为了得到数据,与顺序无关,所不不能使用order by。但是,使用top就不一样了。如:
select top 1 id from tn order by id,得到第一条;select top 1 id from tn order by id desc,得到最后一条。所以,在子查询中,如果不用top,则不能用order by。

还有,就个语句跟where后的别名无关。你的提问可能误导一些人。

参考技术A 这就是原因:

除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。

你的第二个语句中最外层的sql有top,所以能够用 order by

而你的第一个语句,top在最外层,order by 却在内层。
参考技术B 错误信息写的很清楚:错误消息:
消息 1033,级别 15,状态 1,第 10 行
除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。
【子查询内是不是能用Order By的】
除非改成:
select top 2 "Temp".*, "D".dname "DeptName", "S".grade "SalGrade"
from
(
select top 100 "E".deptno "deptNumber",floor(avg("E".sal)) "avgSal",count(*) "PersonNumber"
from emp "E"
where "E".sal > 2000
group by "E".deptno
order by "Temp"."avgSal" desc --这里的差别
) "Temp"
join salgrade "S" on "Temp"."avgSal" >= "S".losal and "Temp"."avgSal" <= "S".hisal
join dept "D" on "D".deptno = "Temp"."deptNumber"
参考技术C where 不能使用别名!

 order by "avgSal" desc 放在外面!
 
 子查询里是不能用order by

以上是关于sql where后面不能使用别名吗的主要内容,如果未能解决你的问题,请参考以下文章

group by 和where 条件后面不能用刚设置的别名。

sql语句中别名怎么使用

为啥不能再where语句中直接使用聚合函数

SQL语句中,子句不能使用列别名问题

SQL语句中,为啥where子句不能使用列别名,而order by却可以?

sqlserver中使用 with as ,后面不能用if else吗?