我的以下选择效果很好,尽管性能不佳。而且我认为问题可能是我在9x以下重复了子查询,并且我确信它可以得到改善。
我认为问题在于如果要更新的列,我会为每个子查询重复以下子查询:
select top 1
gestor_transac.XXXXXXX
from
gestor_transac
where
CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade)
and gestor_transac.uid_producto = gestor_val_pos.uid_producto
and id_cartera = @Arg_ID_cartera
order by
gestor_transac.fecha_tran desc
有人可以看看吗?
update gestor_val_pos
set cantidad = (select top 1 gestor_transac.shabal
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, coste_div_loc = (select top 1 gestor_transac.Coste_LOC_BAL
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, coste_div_car = (select top 1 gestor_transac.Coste_CAR_BAL
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, POS_cum_Inflows = (select top 1 gestor_transac.TRAN_Cum_inflows
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, POS_cum_Outflows = (select top 1 gestor_transac.TRAN_Cum_Outflows
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, Descripcion = (select top 1 gestor_transac.descrpcion
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, Custodio = (select top 1 gestor_transac.custodio
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, Fecha_compra = (select top 1 gestor_transac.fecha_tran
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, Fecha_vencimiento = (select top 1 gestor_transac.fecha_vencimiento
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
where id_cartera= @Arg_ID_cartera and uid_producto= @Arg_UID_pr
答案 0 :(得分:1)
据我所知,您想要apply
:
update gvp
set cantidad = gt.shabal,
. . .
from gestor_val_pos gvp cross apply
(select top (1) gt.*
from gestor_transac gt
where convert(date, gt.fecha_tran) <= convert(date, gvp.fecha_trade) and
gt.uid_producto = gvp.uid_producto and
gt.id_cartera = @Arg_ID_cartera
order by gt.fecha_tran
) gt;
然后您要在gestor_transac(uid_producto, id_cartera, fecha_tran)
上建立索引。