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 Server:交叉引用一个表中的多个列与另一个表中的多个列