计算列的公式基于不同的表列

时间:2010-05-04 21:10:37

标签: sql sql-server-2008 calculated-columns

请考虑此表:c_const

 code  |  nvalue
 --------------
 1     |  10000
 2     |  20000  

和另一个表t_anytable

 rec_id |  s_id  | n_code
 ---------------------
 2      |  x     | 1

目标是根据以下公式将s_id作为计算列:

 rec_id*(select nvalue from c_const where code=ncode)

这会产生错误:

  

在此上下文中不允许使用子查询。只允许使用标量表达式。

如何使用另一个表的列作为输入来计算此计算列的值?

2 个答案:

答案 0 :(得分:71)

您可以为此创建用户定义的函数:

CREATE FUNCTION dbo.GetValue(@ncode INT, @recid INT)
RETURNS INT
AS 
   SELECT @recid * nvalue 
   FROM c_const 
   WHERE code = @ncode

然后使用它来定义计算列:

ALTER TABLE dbo.YourTable
   ADD NewColumnName AS dbo.GetValue(ncodeValue, recIdValue)

答案 1 :(得分:24)

这似乎更适合于视图(索引视图,如果您需要在计算列上快速查找):

CREATE VIEW AnyView
WITH SCHEMABINDING
AS

SELECT a.rec_id, a.s_id, a.n_code, a.rec_id * c.nvalue AS foo
FROM AnyTable a
INNER JOIN C_Const c
    ON c.code = a.n_code

这与子查询版本有细微差别,因为如果连接有多个结果,它将返回多个记录而不是产生错误。但是,UNIQUE c_const.code上的PRIMARY KEY约束很容易解决(我怀疑它已经是JOIN)。

除了子查询版本之外,有人理解它也容易得多。

你可以使用子查询和UDF,如marc_s所示,但与简单的{{1}}相比,这可能高度效率低,因为需要计算标量UDF行接一行。