使用一个列的值来更新另一个列 (SQL Server)?

26

假设我有一个针对某个表的庞大选择操作。一列的一个值是通过复杂的逻辑计算得出的,它被称为ColumnA。现在,对于另一列,我需要从ColumnA中获取该值并将其与其他静态值相加。

示例 SQL:

select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...

我需要的是 [ColumnA] + 10。复杂的部分是一个大的 case/when 块。

有什么想法吗?

5个回答

31

如果您想引用在 SELECT 子句中计算出的值,您需要将现有查询移动到子查询中:

SELECT
    /* Other columns */,
    ColumnA,
    ColumnA + 10 as ColumnB
FROM
(select table.id, table.number, complex stuff [ColumnA].. from table ...
) t

即使你不打算使用它,在上面的括号后,你必须为这个表(在上面的例子中是t)引入一个别名。

(等效地 - 假设你正在使用SQL Server 2005或更高版本 - 你可以将现有的查询移动到CTE中):

;WITH PartialResults as (
     select table.id, table.number, complex stuff [ColumnA].. from table ...
)
SELECT /* other columns */, ColumnA, ColumnA+10 as ColumnB from PartialResults

如果您进行了多层次的部分计算,CTE会看起来更加干净,即如果您现在有了一个依赖于ColumnB的计算可以包含在查询中。


2

Unfortunately, in SQL Server 2016:

SELECT 3 AS a, 6/a AS b;

错误:无效的列名:'a'。

最初的回答


你可以使用cte来实现这个功能:WITH cte AS (SELECT 3 AS a) SELECT a, 6/a AS b FROM cte; - Ludovic Aubert

1
你可以使用子查询和列别名来解决这个问题。
以下是一个例子:
SELECT MaxId + 10
FROM (SELECT Max(t.Id) As MaxId
      FROM SomeTable t) As SomeTableMaxId

1

在查询中重复使用标量表达式的一个方便选项是使用APPLY(或标准SQL中的LATERAL):

SELECT
  table.id,
  table.number,
  [ColumnA],
  [ColumnA] + 10
FROM 
  table
  CROSS APPLY (SELECT complex stuff [ColumnA]) t

1

你可以:

  1. 在客户端代码中执行+ 10
  2. 编写一个标量值函数来封装复杂逻辑的逻辑。它将被优化为单个调用。
  3. 复杂逻辑的逻辑复制到另一列中。它应该被优化为1个调用。
  4. 使用子查询来应用额外的计算

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接