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

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

这会产生一个错误:

子查询在这种情况下是不允许的。 只有标量expression式是允许的。

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

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

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

然后用它来定义你的计算列:

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

这似乎是更多的意见工作(索引视图,如果你需要快速查找计算列):

 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 

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

有人比子查询版本更容易理解。

你可以用marc_s显示的子查询和UDF来实现,但是与简单的JOIN相比,这可能是非常低效的,因为标量UDF将需要逐行计算。