Sybase与SQL Server SELECT别名引用差异及兼容方案问询
SQL Server是否支持Sybase的SELECT别名引用语法?
在Sybase中可以执行以下T-SQL语句:
SELECT 1 AS A, 2 AS B, A+B AS C
但在任何版本的MS SQL Server中执行该语句会报错:
消息 207,级别 16,状态 1,第 9 行
无效的列名 "A"。
消息 207,级别 16,状态 1,第 9 行
无效的列名 "B"。
不过SQL Server支持类似如下的语句:
SELECT field AS a FROM table ORDER BY a
请问SQL Server能否使用与Sybase相同的这类语法?
回答
SQL Server不支持在SELECT列表里直接引用同列表内定义的列别名(就像Sybase里A+B AS C这种写法)。原因很明确:SQL Server的查询执行顺序中,SELECT列表里的表达式计算是在列别名定义之前完成的,所以当它计算A+B时,还没识别到A和B这两个别名。
至于ORDER BY能使用别名,是因为ORDER BY是整个查询执行的最后几步之一,这时候SELECT列表的别名已经被解析好了,自然能正常引用。
要实现类似需求,你可以用这几种替代写法:
- 重复表达式:直接把别名对应的表达式再写一遍,比如:
SELECT 1 AS A, 2 AS B, 1+2 AS C - 子查询包装:先在子查询里定义好别名,外层查询再引用:
SELECT A, B, A+B AS C FROM (SELECT 1 AS A, 2 AS B) AS temp - CTE(公共表表达式):逻辑和子查询一致,但可读性更强:
WITH temp AS ( SELECT 1 AS A, 2 AS B ) SELECT A, B, A+B AS C FROM temp
内容的提问来源于stack exchange,提问作者LarsV
相关产品推荐
相关产品推荐

