2015-03-25 131 views
0

我想编写一个看起来像这样我可以在select语句中使用别名吗?

select 1 as one, 2 as two , one + two as three 

但是SQL Server可以不知道是什么one + two是一个语句。

我可以重新写入这种形式

SELECT x.one 
     ,x.two 
     ,x.one + x.two AS three 
FROM (
    SELECT 1 AS one 
      ,2 AS two 
    ) x 

这给了我我期望的输出。这只是有点混乱(在一个没有人为的例子中更是如此),我也不确定这种事情对SQL Server的内部结构有什么影响,以及它对执行速度的影响。

有没有更好的方法来做到这一点?

+2

你使用子查询的方法是正确的。 – gvee 2015-03-25 12:59:34

+1

不允许引用由select子句创建的其他列的原因是因为指定了SQL语言,因此所有列的计算“好像”都是并行计算的。 – 2015-03-25 13:20:30

回答

4

您不能引用别名在同一SELECT,你需要在一个子查询,以确定它(像你这样),或在Common-table-expression(CTE)

WITH CTE AS 
(
    SELECT 1 as one, 2 as two 
) 
SELECT one, two, one + two AS three FROM CTE 

或此语法:

WITH CTE(one, two) AS 
(
    SELECT 1, 2 
) 
SELECT one, two, one + two as three from CTE 

该规则同样适用于WHEREReference alias (calculated in SELECT) in WHERE clause

但一般来说,如果你使用相同的表达MULT它不会伤害很多时候,sql server优化器只会评估一次。所以,你可以这样做:

SELECT 1 as one, 2 as two , 1 + 2 as three 
+0

谢谢。重复逻辑的问题是,如果有人在一个地方改变它,他们必须记住在第二个地方做。 这两种方法都有好处吗? CTE看起来更清晰。 – Loofer 2015-03-25 13:07:40

+0

@Loofer:是的,这是一个反对重复的好论据。另一个是它通常更复杂。如果你稍后再看,你需要先找出两者是否相同。我也更喜欢CTE。 – 2015-03-25 13:08:50

+0

你还删除了我的编辑,以解释CTE是什么......(Common Table Expression)是故意的?在查看您发布的链接之前,我不明白首字母缩写词,但是您是否有理由恢复该更改? – Loofer 2015-03-25 13:10:39

1

您可以命名自己的价值观很简单的像这样:

SELECT 
    one, two, one + two as three 
FROM (values(1,2)) x(one,two) 
+0

在我的SQL-Server 2005中不起作用,我想它比这更新。 – 2015-03-25 13:10:32

+0

@TimSchmelter它从Sql-server 2008工作2008 – 2015-03-25 13:12:15

+0

谢谢,这里的链接:https://msdn.microsoft.com/en-us/library/dd776382.aspx – 2015-03-25 13:13:06

相关问题