首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将select中的标量UDF转换为表值函数

将select中的标量UDF转换为表值函数
EN

Stack Overflow用户
提问于 2012-08-25 02:31:05
回答 1查看 1.2K关注 0票数 0

我有两张桌子。表1 (DateTable)包含日期和商品名称,表2 (PriceTable)包含一段时间内的价格和价格变化的日期。

表1( DateTable)

代码语言:javascript
复制
| itemName |   Date   |
|    A     | 2012-8-22|
|    A     | 2012-9-2 |

表2( PriceTable)

代码语言:javascript
复制
| Update Date | Price|itemName|
|  2012-7-1   | 5.00 |   A    |
|  2012-8-1   | 5.50 |   A    |
|  2012-9-1   | 6.00 |   A    |

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

我目前使用的是一个标量函数,它非常慢。有没有一种方法可以重写这个函数,要么作为一个表值函数,要么使用其他东西来帮助提高速度呢?我已经盯着这个看了一段时间了,但没有结果。

我当前的查询:

代码语言:javascript
复制
select
    d.date
    ,dbo.fn_GetPrice(d.date, 'A')
from DateTable d
where d.itemName = 'A'

and函数

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-25 02:39:24

这样行得通吗?仅用join替换udf

代码语言:javascript
复制
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'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12114831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档