我必须优化一个相当长的复杂查询,其中包含多个查询。有一个作为第三代 SELECT 重复多次的子查询:
(SELECT mc.cotmoneda2 FROM monedacotizaciones mc WHERE date(mc.`FechaHora`)<= date( p.Fechacreacion) AND mc.tipo=0 order by mc.`FechaHora`desc limit 1))
这是完整查询的简化版本:
SELECT p.ID
,p.Tipo
, p.Numero
, p.Nombre
, e.Empresa
,(CASE p.NroMoneda WHEN 1 Then (SELECT sum(fi.ImportePrecio1/(SELECT mc.cotmoneda2 FROM monedacotizaciones mc where date(mc.`FechaHora`)<= date( p.Fechacreacion) and mc.tipo=0 order by mc.`FechaHora`desc limit 1))
FROM facturasitems fi inner join facturas f on (fi.idFactura= f.Recid)
where (f.estado =0 or f.estado =1 or f.estado =3 ) and f.idpedido = p.`recid`)
ELSE (SELECT sum(fi.ImportePrecio2)
FROM facturasitems fi inner join facturas f on (fi.idFactura= f.Recid)
where (f.estado =0 or f.estado =1 or f.estado =3 ) and f.idpedido = p.`recid`) end) as FacturadoUSA
,(SELECT sum(Ci.ImportePrecio1/(SELECT mc.cotmoneda2 FROM monedacotizaciones mc where date(mc.`FechaHora`)<= date( p.Fechacreacion) and mc.tipo=0 order by mc.`FechaHora`desc limit 1))
FROM Comprasitems ci inner join Compras C on (ci.idCompra= C.Recid)
WHERE (c.estado =0 OR c.estado =1 ) AND C.idpedido = p.`recid`) as CostoRealUSA
,(SELECT sum(dgv.importe/(SELECT mc.cotmoneda2 FROM monedacotizaciones mc where date(mc.`FechaHora`)<= date( p.Fechacreacion) and mc.tipo=0 order by mc.`FechaHora`desc limit 1))
FROM detalles_gastosvarios23 dgv
where dgv.idref = p.Recid) as GastosReales
FROM Pedidos p INNER JOIN `contactos` ON (p.`idref`=`contactos`.`idcontacto`)
INNER JOIN `empresas` e ON (contactos.`idempresa`= e.`idempresa`)
INNER JOIN `talonarios` ON (`talonarios`.`recid`= p.`idtalonario`)
WHERE (p.`fechacreacion` BETWEEN '<%fechainicio%>' AND '<%fechafin%>')
AND talonarios.NroSucursal =1
GROUP BY p.Numero
我想要做的是创建一个包含子查询的用户变量,以便为每条记录重新评估它,但每条记录只重新评估一次。它现在的工作方式,但需要 3 多分钟!我已经多次尝试了许多不同的选项,但看起来我的语法不正确。问题是用户变量子查询包含对 p 的引用。
谢谢,对不起我的英语不好。