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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算列的公式基于不同的表列相关的知识,希望对你有一定的参考价值。

考虑一下这张桌子: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)

这会产生错误:

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

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

答案

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

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)
另一答案

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

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

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

对于某人来说,理解它比子查询版本容易得多。

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

以上是关于计算列的公式基于不同的表列的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中使用代码索引特定数据库的表列

基于表列的多个自动增量ID

基于事实表列创建新的计算度量

我可以使用 SQL 将存储为 CSV(逗号分隔值)的表列的内容拆分为新表中的单独行吗?

尝试在PHP的表列上添加标题

使用 Azure SQL 将不同的表列合并为一个