SQL Server 引用计算列

Posted

技术标签:

【中文标题】SQL Server 引用计算列【英文标题】:SQL Server Reference a Calculated Column 【发布时间】:2010-09-29 15:36:44 【问题描述】:

我有一个包含计算列的 select 语句,我想在另一个计算列中使用一个计算列的值。这可能吗?这是一个人为的例子来展示我想要做什么。

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25

【问题讨论】:

我在同一条船上.. 地狱 SQL 服务器.. MS Access 可以做到这一点。我们的业务用户可以计算出您在问题中所说的内容,并想知道为什么我不能用 SQL 做。 【参考方案1】:

没有。

选择中单行的所有结果都是原子的。也就是说,您可以将它们全部视为并行发生并且不能相互依赖。

如果您指的是计算列,那么您需要更新公式的输入,以便在选择期间更改结果。

将计算列视为宏或迷你视图,在您调用它们时会注入一些计算。

例如,这些列总是相同的:

-- assume that 'Calc' is a computed column equal to Salaray*.25
SELECT Calc, Salary*.25 Calc2 FROM YourTable

还请记住,persisted 选项不会改变任何这些。它保留了适合索引的值,但原子性不会改变。

【讨论】:

【参考方案2】:

如果您正在尝试执行此操作,则无法在 Select 子句中“重置”计算列的值...计算列的值基于计算列公式。哪个可以包含另一个计算列的值....但是您不能重置 Select 子句中的公式...如果您要做的只是“输出”基于两个计算列的值,(如您的语法中的问题读取“然后 “[calcval2]” 在

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25 

只会成为 Select Clause 输出中的列别名。

或者您是在问如何定义一个计算列的公式以基于另一个计算列?

【讨论】:

【参考方案3】:

我能想到两种方法来做到这一点。首先要了解,就 SQL Server 而言,在语句运行之前,calval1 列不存在,因此不能直接使用它,如您的示例所示。因此,您可以将计算放在那里两次,一次用于 calval1,一次用于替换 calval2 计算中的 calcval1。 另一种方法是创建一个包含 calval1 的派生表,然后在派生表之外计算 calval2,如下所示:

select calcval1*.25 as calval2, calval1, field1, field2
from (select casestament as cavlval1, field1, field2 from my table) a

您需要测试两者的性能。

【讨论】:

【参考方案4】:

不幸的是,并非如此,但有时值得的解决方法

SELECT [calcval1], [calcval1] * .25 AS [calcval2]
FROM (SELECT [calcval1] = CASE Statement FROM whatever WHERE whatever)

【讨论】:

这对我有用,但如果您的计算中有许多不同的步骤,您最终可能会得到非常深的嵌套。【参考方案5】:

您应该使用外部应用而不是子选择:

select V.calc,V.calc*0.25 from FOO outer apply (select case Statement as calc) V

【讨论】:

【参考方案6】:

是的,这是可能的。

使用WITH Statement 进行嵌套选择:

【讨论】:

以上是关于SQL Server 引用计算列的主要内容,如果未能解决你的问题,请参考以下文章

更改 SQL Server 2008 中在表的计算列中引用的标量函数

有没有办法使用 SQL Server 2012 查找视图中引用的所有无效列?

更改计算列引用的 SQL 函数

SQL Server:交叉引用一个表中的多个列与另一个表中的多个列

如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来

SQL Server2008 存储过程传入表名称和列名称,如何在语句中使用表明引用列名?