SQL Server计算列从另一个表中选择

The*_*Man 19 sql-server sql-server-2008

我不确定最好的方法是什么,所以我将描述最终目标是什么,如果计算列是答案,那么请帮助我走这条路,或者更好的路线.

我有两张桌子:

命令

OrderId
PackageId
MediaSpend
TotalAdViews (Computed column)
Run Code Online (Sandbox Code Playgroud)

PackageId
BaseAdViews
Run Code Online (Sandbox Code Playgroud)

每个订单都分配了一个包含1000个视图的包,然后您可以购买更多的媒体支出以获得更多视图.我想创建一个名为TotalAdViews的列,它将添加BaseAdViews + MediaSpend.根据我的理解,如果启用持久性,则列不需要在每次查询时重新计算,这可能有助于提高性能.

如何从计算列中的另一个表中获取值?或者请建议另一种方法来实现我的目标.

Gör*_*een 57

我知道这个答案迟了两年,但只是为了帮助任何谷歌搜索并找到这篇文章:

定义用户定义的函数并将其用作计算值是完全合法的.此函数可能包含来自其他表的select语句.

CREATE FUNCTION dbo.getSumAdViews(@packageId int)
RETURNS TABLE
AS
RETURN
    select SUM(BaseAdViews) from Packages where PackageId = @packageId
Run Code Online (Sandbox Code Playgroud)

然后在您的计算列中,只需使用表达式 dbo.getSumAdViews(PackageId)

  • 是的,请注意,如果您希望保留计算列,这将不起作用. (4认同)
  • @liang 具有用户定义函数的计算列对您的性能不利,因为查询优化器不会扩展到用户定义的函数。 (2认同)
  • @erkinyldz 您将无法保留此类列,因为 UDF 将是不确定的 https://docs.microsoft.com/en-us/sql/relational-databases/user-defined-functions/deterministic-and-非确定性函数和只有确定性列可以被持久化。UDF 中的任何 SELECT 都会使其不确定。 (2认同)
  • 虽然标量 UDF 或多语句 UDF 确实会强制查询计划放弃并行性,但如果您可以使函数成为内联表值函数,那么它与没有 UDF 时一样高效。我已经更新了我的答案以给出这样的例子。 (2认同)

Sco*_*nro 17

您将无法在计算列表达式中使用其他表中的列.这是MSDN文档的摘录.

计算列是根据可以使用同一表中其他列的表达式计算的.

您提到使用计算列的动机是提高性能.有很多限制,索引视图可能会在这里增加价值.


The*_*war 5

如果只是为了显示目的,为什么不创建一个视图..

select <<add other columns you need>> mediaspend+basicadviews as totaladviews
from 
orders o
join
packages p
on p.packageid=o.orderid
Run Code Online (Sandbox Code Playgroud)