Forum Discussion
Rendimiento de script con cross apply o full outer join
Hola, quisiera saber como puedo mejorar el tiempo de respuesta de un script en el cual cruzo datos de multiples tablas (3, 4 tablas) con cross apply o con full outer join
- olafhelperBronze ContributorThat's to less on information.
Please post table design as DDL, some sample data as DML statement and the expected result.- wcastroCopper Contributor
Hola olafhelper y toda la comunidad
Buenas tardes, la consulta que tengo me trae por operación 4 registros. Necesito un solo registro por operación (los que están marcados en color negro)
Este es el script
----- consultar
SELECT
Q.Ceq11BOpe [Operacion] -- es la llave
,CAST(PM.SALDOACTUAL AS decimal(17, 2)) [Saldo],PM.FECHAADJUDICACION [F Prestamo]
,1 [TipoTasa]
,1 [TipoDias]
,'P' [TipoAjusteVto]
,1 [TipoAño]
,CASE WHEN PM.SECUENCIAL = PCC3.SECUENCIALPRESTAMO and max(pcc3.SECUENCIAL) = max(PCCG.SECUENCIALPRESTAMOCOMPCARTERA) THEN 'S' ELSE 'N' END [Md]
,null [FechaUltimaRevisionTasa]
,1 [codClasifInterna]
,CASE WHEN t1.VCI IS NULL THEN 0 ELSE t1.VCI END [Importe2] --corriente
,CASE WHEN pcc2.VALORCOBRADO IS NULL THEN 0 ELSE CAST(pcc2.VALORCOBRADO AS decimal) END [Importe3] --mora
,CASE WHEN t3.VCC IS NULL THEN 0 ELSE t3.VCC END [Importe4] --comision
,CASE WHEN t2.VCS IS NULL THEN 0 ELSE t2.VCS END [Importe12] --seguro
FROM [Intermedia].[dbo].CEQ011 Q
INNER JOIN FBS_CARTERA.PRESTAMOMAESTRO PM ON Q.Ceq11Id1 = PM.SECUENCIAL
left JOIN FBS_CARTERA.PRESTAMOTASAINTERES PTI ON PTI.SECUENCIALPRESTAMO = PM.SECUENCIAL And PTI.SECUENCIAL = (SELECT MAX(TI.SECUENCIAL) FROM FBS_CARTERA.PRESTAMOTASAINTERES TI WHERE TI.SECUENCIALPRESTAMO = PM.SECUENCIAL)
left join Fbs_Cartera.Prestamocomponente_Cartera pcc2 on pm.SECUENCIAL = pcc2.SECUENCIALPRESTAMO AND pcc2.SECUENCIAL = (select max(pccM.secuencial) from Fbs_Cartera.Prestamocomponente_Cartera pccM where pccM.SECUENCIALPRESTAMO = pm.SECUENCIAL)
left join FBS_NEGOCIOSFINANCIEROS.COMPONENTE cpn on pcc2.SECUENCIALCOMPONENTECARTERA = cpn.SECUENCIAL and cpn.NOMBRE LIKE '%MORA%'
left join FBS_CARTERA.PRESTAMOCOMPONENTE_CARTERA PCC3 on PM.SECUENCIAL = PCC3.SECUENCIALPRESTAMO AND pcc3.SECUENCIAL = (select max(pccA.secuencial) from Fbs_Cartera.Prestamocomponente_Cartera pccA where pccA.SECUENCIALPRESTAMO = pm.SECUENCIAL and pccA.SECUENCIALCOMPONENTECARTERA in (672, 673))
left join FBS_CARTERA.PRESTAMOCOMPONENTE_CARTERAPERIODOGRACIA PCCG on PCCG.SECUENCIALPRESTAMOCOMPCARTERA = PCC3.SECUENCIAL
left join FBS_CARTERA.PRESTAMOCLIENTE pc on pm.SECUENCIAL = pc.SECUENCIALPRESTAMO
left join FBS_CLIENTES.CLIENTE ct on pc.secuencialcliente = ct.SECUENCIAL
inner join [Intermedia].[dbo].[MgHm001] FST049 on CAST(ct.ESPREFERENCIAL AS smallint) = FST049.MgHOriN1 and FST049.MgHTbl = 'FST049'
INNER JOIN FBS_GENERALES.EMPRESA e on e.SECUENCIAL = pm.SECUENCIALEMPRESA
INNER JOIN FBS_GENERALES.CALENDARIO c on e.SECUENCIAL = c.SECUENCIALEMPRESA and c.FECHASISTEMA = PM.FECHAADJUDICACION
INNER JOIN FBS_CARTERA.ESTADOPRESTAMO EP ON EP.CODIGO = PM.CODIGOESTADOPRESTAMO
INNER JOIN [Intermedia].[dbo].[MgHm001] FST026 ON FST026.MgHOriT1 = EP.CODIGO AND FST026.MgHTbl = 'FST026'
cross apply --full outer join
--select t1.vci, t2.vcs, t3.vcc from
(
select pmi.SECUENCIAL, sum(pccci.VALORCAUSADO) VCI --pcc.SECUENCIALPRESTAMO, pcc.SECUENCIALCOMPONENTECARTERA
from FBS_CARTERA.PRESTAMOMAESTRO PMI
INNER JOIN FBS_CARTERA.PRESTAMOCOMPONENTE_CARTERA PCCI ON PMI.SECUENCIAL = PCCI.SECUENCIALPRESTAMO
INNER JOIN FBS_CARTERA.PRESTAMOCOMPONTE_CARTERACAUSACION PCCCI ON PCCI.SECUENCIAL = PCCCI.SECUENCIALPRESTAMOCOMPCARTERA
WHERE PMI.CODIGOESTADOPRESTAMO NOT IN ('G', 'Z') and pmi.SECUENCIAL in (1237797, 1237097, 960605, 744615)
and pcci.SECUENCIALCOMPONENTECARTERA = 7 --interes
group by pmi.SECUENCIAL --pcc.SECUENCIALPRESTAMO --, pcc.SECUENCIALCOMPONENTECARTERA
) t1
full outer join --outer apply -- crossapply
(
select pms.SECUENCIAL, sum(pcccs.VALORCAUSADO) VCS --pcc.SECUENCIALPRESTAMO, pcc.SECUENCIALCOMPONENTECARTERA
from FBS_CARTERA.PRESTAMOMAESTRO PMS
INNER JOIN FBS_CARTERA.PRESTAMOCOMPONENTE_CARTERA PCCS ON PMS.SECUENCIAL = PCCS.SECUENCIALPRESTAMO
INNER JOIN FBS_CARTERA.PRESTAMOCOMPONTE_CARTERACAUSACION PCCCS ON PCCS.SECUENCIAL = PCCCS.SECUENCIALPRESTAMOCOMPCARTERA
WHERE PMS.CODIGOESTADOPRESTAMO NOT IN ('G', 'Z') and pms.SECUENCIAL in (1237797, 1237097, 960605, 744615)
and pccs.SECUENCIALCOMPONENTECARTERA = 9 --seguro
group by pms.SECUENCIAL -- pcc.SECUENCIALPRESTAMO --,pcc.SECUENCIALCOMPONENTECARTERA
) t2 on t1.SECUENCIAL = t2.SECUENCIAL -- t1.SECUENCIALPRESTAMO = t2.SECUENCIALPRESTAMO
full outer join --outer apply -- crossapply
(
select pmc.secuencial, sum(pcccc.VALORCAUSADO) VCC --pcc.SECUENCIALPRESTAMO, pcc.SECUENCIALCOMPONENTECARTERA
from FBS_CARTERA.PRESTAMOMAESTRO PMC
INNER JOIN FBS_CARTERA.PRESTAMOCOMPONENTE_CARTERA PCCC ON PMC.SECUENCIAL = PCCC.SECUENCIALPRESTAMO
INNER JOIN FBS_CARTERA.PRESTAMOCOMPONTE_CARTERACAUSACION PCCCC ON PCCC.SECUENCIAL = PCCCC.SECUENCIALPRESTAMOCOMPCARTERA
WHERE PMC.CODIGOESTADOPRESTAMO NOT IN ('G', 'Z') and pmc.SECUENCIAL in (1237797, 1237097, 960605, 744615)
and pccc.SECUENCIALCOMPONENTECARTERA = 10 --comision
group by pmc.SECUENCIAL -- pcc.SECUENCIALPRESTAMO --,pcc.SECUENCIALCOMPONENTECARTERA
) t3 on t2.SECUENCIAL = t3.SECUENCIAL -- t2.SECUENCIALPRESTAMO = t3.SECUENCIALPRESTAMO
WHERE Q.Ceq11Cpt = 'CONV' --'PREA'
and PM.CODIGOESTADOPRESTAMO NOT IN ('G', 'Z')
and pm.SECUENCIAL in (1237797, 1237097, 960605, 744615)
group by Q.Ceq11BOpe
,pm.SECUENCIAL, pm.NUMEROPRESTAMO, PM.SALDOACTUAL, PM.FECHAADJUDICACION, PM.FECHAVENCIMIENTO,PTI.TASAINTERES, PM.DEUDAINICIAL, PCC3.SECUENCIAL, PCC3.SECUENCIALPRESTAMO, PCCG.SECUENCIALPRESTAMOCOMPCARTERA, ct.ESPREFERENCIAL
,FST026.MgHDesN1, PM.FRECUENCIAPAGO, C.ESHABIL, C.ESFESTIVOCALENDARIO, pcc2.VALORCOBRADO, t1.VCI, t2.VCS, t3.VCC