0

有时您希望将字符串或 int 附加到给定列中的数据,例如SELECT 1005 + ID FROM Users(您将在 ID 列数据中添加 1005)。对于动态创建的列,如何做到这一点?

以下作品:

SELECT ID,
       Name,
       (SELECT Email FROM Emails WHERE Emails.ID = d.ID) AS Email,
       Address
FROM data d

但是添加以下新行会产生错误Invalid column name "Email"

SELECT ID,
       Name,
       (SELECT Email FROM Emails WHERE Emails.ID = d.ID) AS Email,
       Email + ' testing ' AS Test, /* New line that causes error */
       Address
FROM data d

如何修复此错误?

4

3 回答 3

3

您不能引用别名。您可以重复表达式(通常在性能方面和/或在语法方面不明智)或使用子查询/CTE。为什么要使用相关子查询而不是联接?

SELECT ID, Name, Email, Email + ' testing' AS Test, Address
FROM
(
  SELECT d.ID, d.Name, e.Email, d.Address
  FROM dbo.data AS d
  INNER JOIN dbo.Emails AS e
  ON e.ID = d.ID
) AS x;

...或CTE ...

;WITH x AS
(
  SELECT d.ID, d.Name, e.Email, d.Address
  FROM dbo.data AS d
  INNER JOIN dbo.Emails AS e
  ON e.ID = d.ID
)
SELECT ID, Name, Email, Email + ' testing' AS Test, Address
  FROM x;
于 2013-08-28T18:04:39.980 回答
1

这是不应该在子查询中完成的事情,而是使用连接。一般的相关子查询是一种糟糕的技术,因为它们可能会成为性能杀手,而且很少需要。它们应该是最后手段而不是第一手段。

SELECT ID,
       Name,
       Email,
       Email + ' testing ' AS Test, 
       Address
FROM data d 
JOIN Emails e ON e.ID = d.ID

如果每个人都没有电子邮件,请使用左连接。如果有多个电子邮件地址,那么您可能需要一些额外的标准来过滤,或者您可能需要使用聚合函数。

于 2013-08-28T18:12:17.127 回答
0

看起来您遇到的问题是您试图引用“超出范围”的内容。当您在 select 语句中使用子查询时,子查询表只能访问该项目。该访问权限不会延续到 select 语句中的其他项目。所以,这应该对你有用(如果它很丑而且它有效,那就不丑了)。

SELECT ID,
   Name,
   (SELECT Email FROM Emails WHERE Emails.ID = d.ID) AS Email,
   (SELECT Email FROM Emails WHERE Emails.ID = d.ID) 
      + ' testing ' AS Test, 
   Address
FROM data d
于 2013-08-28T18:44:19.147 回答