欢迎光临

木子屋

标题: 为什么SQL Server Sel&#101;ct语句中Wh&#101;re不能使用列别名？

作者: dnawo

日期: 2013-05-06 03:23 PM

分类: 服务器

内容: 可能有人已经发现，在SQL Server Select语句中Where不能使用列别名，而ORDER BY却可以，例如：
复制内容到剪贴板 程序代码select Id as UserId from [User] where UserId<10000
select Id as UserId from [User] order by UserId desc
第一条语句执行会出错，提示列名 'UserId' 无效，第二条语句能正常执行。同样的问题在having中也存在：
复制内容到剪贴板 程序代码select Brand,COUNT(*) as total from [User]
group by Brand having total>1000
order by total desc
这是为什么呢？这主要是受Select语句的处理顺序的影响，在SQL Server 2008帮助文档说明如下：
引用内容Select语句的处理顺序
1.FROM
2.ON
3.JOIN
4.Where
5.GROUP BY
6.WITH CUBE 或 WITH ROLLUP
7.HAVING
8.Select
9.DISTINCT
10.ORDER BY
11.TOP
由于Where在Select前执行，所以执行Where时列别名还不存在，当然无法使用，而ORDER BY在Select后执行，自然可以使用列别名。处理顺序也解释了为什么表别名在任何地方都可以使用，例如：
复制内容到剪贴板 程序代码select * from [User] a where a.Id<10000 order by a.Id desc

+ 查看当前日志评论 (0)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.203 ms

返回

标题: 为什么SQL Server Sel&#101;ct语句中Wh&#101;re不能使用列别名？

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.203 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.234 ms

返回