50

考虑这张表: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)

这会产生一个错误:

在这种情况下不允许子查询。只允许标量表达式。

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

4

2 回答 2

77

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

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)
于 2010-05-04T21:13:24.767 回答
25

这似乎更像是视图的工作(索引视图,如果您需要在计算列上快速查找):

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(我怀疑它已经是 a PRIMARY KEY)来解决。

它也比子查询版本更容易理解。

正如 marc_s 所示,您可以使用子查询和 UDF 来执行此操作,但与简单的 相比,这可能效率非常JOIN低,因为需要逐行计算标量 UDF。

于 2010-05-04T21:19:26.023 回答