我不确定最好的方法是什么,所以我将描述最终目标是什么,如果计算列是答案,那么请帮助我走这条路,或者更好路由。
我有两张桌子:
订单
OrderId
PackageId
MediaSpend
TotalAdViews (Computed column)
包
PackageId
BaseAdViews
每个订单都会分配一个包含1000个视图的包,然后您可以购买更多的媒体支出以获得更多观看次数。我想创建一个名为TotalAdViews的列,它将添加BaseAdViews + MediaSpend。根据我的理解,如果启用持久性,则列不需要在每次查询时重新计算,这可能有助于提高性能。
如何从计算列中的另一个表中获取值?或者请建议另一种方法来实现我的目标。
答案 0 :(得分:54)
我知道这个答案迟了两年,但只是为了帮助任何谷歌搜索并找到这篇文章:
定义用户定义的函数并将其用作计算值是完全合法的。此函数可能包含来自其他表的select语句。
CREATE FUNCTION dbo.getSumAdViews(@packageId int)
RETURNS TABLE
AS
RETURN
select SUM(BaseAdViews) from Packages where PackageId = @packageId
然后在您的计算列中,只需使用表达式dbo.getSumAdViews(PackageId)
答案 1 :(得分:16)
您将无法在计算列表达式中使用其他表中的列。这是MSDN documentation的摘录。
计算列是根据可以使用同一表中其他列的表达式计算的。
您提到使用计算列的动机是提高性能。有很多restrictions,但indexed view可能会在这里增加价值。
答案 2 :(得分:1)
如果仅用于显示目的,为什么不创建视图..
select <<add other columns you need>> mediaspend+basicadviews as totaladviews
from
orders o
join
packages p
on p.packageid=o.orderid