假设我有一个针对某个表的庞大选择操作。一列的一个值是通过复杂的逻辑计算得出的,它被称为ColumnA。现在,对于另一列,我需要从ColumnA中获取该值并将其与其他静态值相加。
示例 SQL:
select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...
我需要的是 [ColumnA] + 10。复杂的部分是一个大的 case/when 块。
有什么想法吗?
假设我有一个针对某个表的庞大选择操作。一列的一个值是通过复杂的逻辑计算得出的,它被称为ColumnA。现在,对于另一列,我需要从ColumnA中获取该值并将其与其他静态值相加。
示例 SQL:
select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...
我需要的是 [ColumnA] + 10。复杂的部分是一个大的 case/when 块。
有什么想法吗?
如果您想引用在 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的计算可以包含在查询中。
Unfortunately, in SQL Server 2016:
SELECT 3 AS a, 6/a AS b;
错误:无效的列名:'a'。
最初的回答
SELECT MaxId + 10
FROM (SELECT Max(t.Id) As MaxId
FROM SomeTable t) As SomeTableMaxId
在查询中重复使用标量表达式的一个方便选项是使用APPLY
(或标准SQL中的LATERAL
):
SELECT
table.id,
table.number,
[ColumnA],
[ColumnA] + 10
FROM
table
CROSS APPLY (SELECT complex stuff [ColumnA]) t
你可以:
+ 10
复杂逻辑
的逻辑。它将被优化为单个调用。复杂逻辑
的逻辑复制到另一列中。它应该被优化为1个调用。