【问题标题】:Convert scalar UDF in select to table valued function将选择中的标量 UDF 转换为表值函数
【发布时间】:2012-08-24 18:31:05
【问题描述】:

我有 2 张桌子。表 1 (DateTable) 包含日期和项目名称,表 2 (PriceTable) 包含随时间变化的价格和价格变化的日期。

表 1(日期表)

| itemName |   Date   |
|    A     | 2012-8-22|
|    A     | 2012-9-2 |

表 2(价格表)

| Update Date | Price|itemName|
|  2012-7-1   | 5.00 |   A    |
|  2012-8-1   | 5.50 |   A    |
|  2012-9-1   | 6.00 |   A    |

我的任务是,给定一个日期,我想确定该日期的商品价格。

我目前正在使用标量函数执行此操作,这真的很慢。有没有办法可以重写它,或者作为表值函数或者使用其他有助于加快速度的方法?我已经盯着这个有一段时间了,但无济于事。

我目前的查询:

select
    d.date
    ,dbo.fn_GetPrice(d.date, 'A')
from DateTable d
where d.itemName = 'A'

和功能

alter function fn_GetPrice(@date DateTime, @itemName varchar(50))
returns int
as
begin
declare @price int
    select @price = p.price
    from PriceTable p
    where p.itemName = @itemName
        and p.updateDate = (select MAX(p2.updateDate)
            from PriceTable p2
            where p2.updateDate < @date
                and p2.itemName = @itemName)
return @price
end

【问题讨论】:

    标签: sql-server sql-server-2008 query-optimization user-defined-functions


    【解决方案1】:

    这行得通吗?将udf 替换为join

    select
        d.date,
        p.Price
    from 
        DateTable d 
        join PriceTable p
            on p.itemName = d.itemName
            and p.updateDate = (
                select max(p2.updateDate)
                from PriceTable p2
                where 
                    p2.updateDate < d.date
                    and p2.itemName = p.itemName
            )
    where d.itemName = 'A'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      相关资源
      最近更新 更多