Convierta UDF escalar en función de selección a valor de tabla
Frecuentes
Visto 1,172 veces
0
tengo 2 mesas La tabla 1 (DateTable) contiene fechas y nombres de artículos, la tabla 2 (PriceTable) contiene precios a lo largo del tiempo y las fechas en que cambió el precio.
Tabla 1 (tabla de fechas)
| itemName | Date |
| A | 2012-8-22|
| A | 2012-9-2 |
Tabla 2 (Tabla de Precios)
| Update Date | Price|itemName|
| 2012-7-1 | 5.00 | A |
| 2012-8-1 | 5.50 | A |
| 2012-9-1 | 6.00 | A |
Mi tarea es, dada una fecha, quiero determinar cuál era el precio del artículo en esa fecha.
Actualmente estoy haciendo esto con una función escalar, que es realmente lenta. ¿Hay alguna manera de que pueda reescribir esto, ya sea como una función de valores de tabla o usando algo más que ayude a acelerar esto un poco? He estado mirando esto por un tiempo sin éxito.
Mis consultas actuales:
select
d.date
,dbo.fn_GetPrice(d.date, 'A')
from DateTable d
where d.itemName = 'A'
y función
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
1 Respuestas
1
¿Funcionaría esto? Reemplazo de la udf
con solo un 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'
Respondido 24 ago 12, 19:08
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas sql-server sql-server-2008 query-optimization user-defined-functions or haz tu propia pregunta.