Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何处理SQL Server中动态创建列中的数据?_Sql Server_Dynamic_Calculated Columns - Fatal编程技术网

Sql server 如何处理SQL Server中动态创建列中的数据?

Sql server 如何处理SQL Server中动态创建列中的数据?,sql-server,dynamic,calculated-columns,Sql Server,Dynamic,Calculated Columns,有时,您希望将字符串或int附加到给定列中的数据,例如SELECT 1005+ID FROM Users(将1005添加到ID列数据中)。如何对动态创建的列执行此操作 以下工作: SELECT ID, Name, (SELECT Email FROM Emails WHERE Emails.ID = d.ID) AS Email, Address FROM data d 但是添加以下新行会产生错误无效的列名“Email”: 如何修复此错误?您不能引用别

有时,您希望将字符串或int附加到给定列中的数据,例如
SELECT 1005+ID FROM Users
(将1005添加到ID列数据中)。如何对动态创建的列执行此操作

以下工作:

SELECT ID,
       Name,
       (SELECT Email FROM Emails WHERE Emails.ID = d.ID) AS Email,
       Address
FROM data d
但是添加以下新行会产生错误
无效的列名“Email”


如何修复此错误?

您不能引用别名。您可以重复表达式(通常在性能和/或语法方面不明智)或使用子查询/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;

您不能引用别名。您可以重复表达式(通常在性能和/或语法方面不明智)或使用子查询/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;

这是不应该在子查询中执行的操作,请改用联接。genral中的相关子查询是一种糟糕的技术,因为它们可能是性能杀手,而且很少需要。它们应该是最后手段,而不是第一手段

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

如果每个人都没有电子邮件,请使用左键加入。如果存在多个电子邮件地址,则您可能需要一些附加条件进行筛选,或者您可能需要使用聚合功能

这是不应该在子查询中执行的操作,请改用联接。genral中的相关子查询是一种糟糕的技术,因为它们可能是性能杀手,而且很少需要。它们应该是最后手段,而不是第一手段

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

如果每个人都没有电子邮件,请使用左键加入。如果存在多个电子邮件地址,则您可能需要一些附加条件进行筛选,或者您可能需要使用聚合功能

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


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



那么什么是可能的解决方案呢?我上面给出的例子就是:一个例子。我正在处理的查询类型非常复杂,无法使用联接来完成我需要的操作,这就是为什么我要问这个问题。@好吧,这将是一样的:您的原始查询将在
()
部分中执行,您将从外部范围引用别名。您不能在同一级别引用别名。谢谢,这个建议帮助我朝着正确的方向前进。那么,可能的解决方案是什么呢?我上面给出的示例就是:一个示例。我正在处理的查询类型非常复杂,无法使用联接来完成我需要的操作,这就是为什么我要问这个问题。@好吧,这将是一样的:您的原始查询将在
()
部分中执行,您将从外部范围引用别名。您不能在同一级别引用别名。谢谢,这个建议帮助我朝着正确的方向前进。OP说实际查询要复杂得多,而子查询在更复杂的版本中是必需的。您需要为列添加别名(至少重复ID列)。OP表示实际查询要复杂得多,而子查询在更复杂的版本中是必需的。您需要对列进行别名(至少重复ID的列)。您认为重复相关子查询是明智的,因为知道SQL Server很可能会被迫对其进行多次评估吗?请注意:其他受访者正确地表示,如果您经常这样做,join是一个更好的解决方案,子查询将需要更多的处理power@Aaron:不,我认为加入会更好更有效。这个解决方案很难看,但它应该纠正在不使用联接的情况下所发生的错误。我指的是通常重复表达式(任何表达式)的方法,但特别是当OP被迫使用相关子查询时(正如他在上面的注释中所解释的)。重复表达式当然是一种方法,但就复杂性而言,它是最不理想的(假设表达式比这复杂得多),就性能而言,它也可能是最不理想的。@AaronBertrand如果每天必须运行数百次或数千次查询,使用最佳解可能是理想的。但是,如果他只运行一次,并且不想重构连接的查询,那么这应该是可行的。我有一个查询,在select语句中有一百个这样的子查询(对一个表进行反规范化以便分析它)。因为我一天只需要运行几次,所以我不关心优化。你认为重复一个相关子查询是明智的吗,因为知道SQL Server很可能会被迫对其进行多次评估?只需注意:其他回答者正确地说,如果你经常这样做,加入是一个更好的解决方案,子查询将需要更多的处理power@Aaron:不,我认为加入会更好更有效。这个解决方案很难看,但它应该纠正在不使用联接的情况下所发生的错误。我指的是通常重复表达式(任何表达式)的方法,但特别是当OP被迫使用相关子查询时(正如他在上面的注释中所解释的)。重复表达式当然是一种方法,但就复杂性而言,它是最不理想的