Adn*_*KEN 47 sql calculated-columns sql-server-2008
考虑一下这个表: c_const
code | nvalue
--------------
1 | 10000
2 | 20000
Run Code Online (Sandbox Code Playgroud)
和另一张桌子 t_anytable
rec_id | s_id | n_code
---------------------
2 | x | 1
Run Code Online (Sandbox Code Playgroud)
目标是s_id基于以下公式成为计算列:
rec_id*(select nvalue from c_const where code=ncode)
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
在此上下文中不允许子查询.只允许标量表达式.
如何使用另一个表的列作为输入来计算此计算列的值?
mar*_*c_s 72
您可以为此创建用户定义的函数:
CREATE FUNCTION dbo.GetValue(@ncode INT, @recid INT)
RETURNS INT
AS
SELECT @recid * nvalue
FROM c_const
WHERE code = @ncode
Run Code Online (Sandbox Code Playgroud)
然后使用它来定义您的计算列:
ALTER TABLE dbo.YourTable
ADD NewColumnName AS dbo.GetValue(ncodeValue, recIdValue)
Run Code Online (Sandbox Code Playgroud)
Aar*_*ght 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
Run Code Online (Sandbox Code Playgroud)
这与子查询版本有细微差别,因为如果连接有多个结果,它将返回多个记录而不是产生错误.但这很容易通过UNIQUE约束来解决c_const.code(我怀疑它已经是一个PRIMARY KEY).
对于某人来说,理解它比子查询版本容易得多.
您可以使用子查询和UDF来执行此操作,正如marc_s所示,但与简单相比,这可能是非常低效的JOIN,因为标量UDF将需要逐行计算.
| 归档时间: |
|
| 查看次数: |
66576 次 |
| 最近记录: |