【发布时间】:2015-04-24 15:48:08
【问题描述】:
我需要在其他字段中选择客户在购买特定品牌的某些产品时的年龄等,例如客户的年龄在 30 到 50 岁之间。我写了这个查询(getAge 只是使用 DATEDIFF 返回年龄)
SELECT DISTINCT customers.FirstName, customers.LastName,
products.ProductName,
dbo.getAge(customers.BirthDate,sales.Datekey)
AS Age_when_buying
FROM sales
INNER JOIN dates ON sales.Datekey=dates.Datekey
INNER JOIN customers ON sales.CustomerKey=customers.CustomerKey
INNER JOIN products ON sales.ProductKey=products.ProductKey
INNER JOIN stores ON sales.StoreKey=stores.StoreKey
WHERE stores.StoreName = 'DribleCom Europe Online Store' AND
products.BrandName = 'Proseware' AND
dbo.getAge(customers.BirthDate, sales.Datekey) >= 30 AND
dbo.getAge(customers.BirthDate, sales.Datekey) <=50
它有效,但我计算了三次年龄。我试图将 age_when_buying 分配给一个变量,但它不起作用。我的下一个想法是使用光标,但我觉得我缺少一种更简单的方法。问题是:解决这个问题的合适方法是什么,或者我有什么选择?
【问题讨论】:
-
dbo.getAge是标量 UDF 吗?请考虑使用内联表值函数。 -
如果我们要优化性能,请向我们展示 dbo.getAge 的函数体
-
@AaronBertrand 但是表值函数会计算所有客户的年龄,对吧?如果不是,性能会有很大差异吗?
-
视情况而定。如果您有一个通过
APPLY调用的 TVF,它很可能只会针对过滤后的集合运行(但这完全取决于优化器如何分解它)。绝对可以肯定,它与单个标量函数调用一样快,但很可能更快。
标签: sql sql-server database performance