-1

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

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

谢谢。

4

3 回答 3

1

这是什么问题!因为您使用子查询的位置是别名位置。别名是您赋予长名称以便在查询的其他部分轻松使用它们的名称。我想你的想法是这样的代码:

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

干杯

于 2012-10-08T22:12:30.330 回答
0

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

于 2012-10-08T22:13:10.467 回答
0

已编辑

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

不,这是不可能的,也不太可能得到 ISO SQL 标准组的任何喜爱。您正在混合 RDBMS 和前端语义的目的。

想象一下,如果您有2 行数据,1 行用于 [Tokyo],1 行用于 [Kyoto],会发生什么情况。你会给这个专栏起什么名字?更好的选择是生成 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 表达式中是不允许的。

除非 price.cityid 可能不存在于 Cities 表中(在这种情况下您的查询很好),否则最好重写

select c.price, ci.CityName
  from prices c
  join Cities ci on ci.cityid= c.cityid
 where cityid=1
于 2012-10-08T22:10:12.837 回答