来自另一个查询的SQL Server列别名

时间:2012-10-08 22:06:37

标签: sql tsql sql-server-2005 sql-server-2005-express

为什么此代码在SQL Server 2005中不起作用?

select c.price AS (select CityName from Cities ci where ci.cityid= c.cityid)
from prices c
where cityid=1

感谢。

3 个答案:

答案 0 :(得分:1)

真是个问题!因为您使用子查询的位置是别名位置。 Alias是您为长名称提供的,可以在查询的其他部分轻松使用它们。我想你的想法是这样的代码:

Select  c.price
,   ci.CityName
    From    prices  As  c
    Inner   Join
        Cities  As  ci 
    On  ci.cityid   =   c.cityid

还请用嵌套式编写代码。它很容易阅读,更容易理解。

<强>更新

如果您需要城市列表作为列名称和价格低于它们,则应使用"PIVOT"运算符。喜欢这段代码:

Select  PivotedResult.[1]   As  US
,   PivotedResult.[2]   As  UK
,   PivotedResult.[3]   As  IR
    From    prices  As  c
    Pivot   (
        Sum(c.price)
        For c.cityid    In  (
            [1]
        ,   [2]
        ,   [3]
        )
    )   As  PivotedResult

干杯

答案 1 :(得分:0)

<强> EDITED

select c.price AS [Tokyo] from prices c where c.cityid=1

不,这是不可能的,也不可能从ISO ISO标准组获得任何爱。您正在混合使用RDBMS和前端语义的目的。

想象一下,如果您有 2行数据,一个用于[东京],一个用于[京都],会发生什么。你会把这个专栏命名为什么?更好的选择是生成2列,如下所示,让前端使用第2列的标签。

<小时/> 也许

select c.price
      ,(select CityName from Cities ci where ci.cityid= c.cityid) AS CityName
  from prices c
 where cityid=1

当您希望将输出列命名为查询的调用者时,将使用术语“列别名”。在这种情况下,将返回子查询中的CityName,并将该查询中的第二列命名为“CityName”。

假设cityid是唯一的,那么子查询返回多个结果时不会有任何问题 - 这在SELECT表达式中是不允许的。

除非在Cities表中不存在prices.cityid(在这种情况下你的查询是好的),否则最好重写

select c.price, ci.CityName
  from prices c
  join Cities ci on ci.cityid= c.cityid
 where cityid=1

答案 2 :(得分:0)

因为在SQL的任何规范或标准中都没有它说它应该工作。来自任何rdbms的SQL都是关于数据的,而不是它的呈现方式。