In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Optimizar consulta SQL

SQL databases
Pedro Amaro
Posts: 157
Joined: Thu May 18, 2006 5:10 pm

Optimizar consulta SQL

Postby Pedro Amaro » Wed Dec 19, 2007 9:28 am

Muy buenas;
He estado algunos días peleandome con esta consulta para MySQL y al final
funciona como yo quiero, pero me parece poco optimizado el codigo.
SELECT a.codigo, a.descrip, a.envase,
CASE WHEN (SELECT f.pvp FROM tarifas f WHERE f.id_tarifa = 1 AND
f.cod_art = a.codigo) IS NULL
THEN a.precio
ELSE (SELECT f.pvp FROM tarifas f WHERE f.id_tarifa = 1 AND f.cod_art =
a.codigo)
END AS pof FROM articulo a ORDER BY a.descrip
Funciona bien y es bastante rapida, pero me duele mucho tener duplicado en
la misma consulta.
¿Hay en MySQL algo asi como variables temporales para asignarle el valor de
la subconsulta una sola vez y poder hacer el CASE sobre esa variable?
Un saludo
Pedro Amaro
Manu Exposito
Posts: 110
Joined: Wed Feb 08, 2006 4:41 pm

Optimizar consulta SQL

Postby Manu Exposito » Wed Dec 19, 2007 8:56 pm

Pedro qué quieres conseguir?
Pedro Amaro
Posts: 157
Joined: Thu May 18, 2006 5:10 pm

Optimizar consulta SQL

Postby Pedro Amaro » Thu Dec 20, 2007 9:18 am

Hola Manu;
No es tanto corregir, que funciona, sino optimizar. A mi parecer un
desperdicio de recursos tener dos veces el SELECT interior
"SELECT f.pvp FROM tarifas f WHERE f.id_tarifa = 1 AND f.cod_art =
a.codigo"
Mi cuestion es si hay alguna manera de asignar el resultado de ese SELECT en
alguna "variable" temporal para usarlo tanto en el CASE WHEN como en el ELSE
dentro de la consulta SQL.
Algo así
SubConsulta := SELECT f.pvp FROM tarifas f WHERE f.id_tarifa = 1 AND
f.cod_art = a.codigo
SELECT a.codigo, a.descrip, a.envase,
CASE WHEN SubConsulta IS NULL
THEN a.precio
ELSE SubConsulta
END AS pof FROM articulo a ORDER BY a.descrip
Pero claro dentro de la instrucción SQL.
Un saludo
Pedro Amaro
Nota: Ahora que veo lo que he escrito me da que no queda muy claro que lo
que quiero guardar en SubConsulta es el resultado del SELECT no la cadena de
busqueda.
jose.luis
Posts: 1633
Joined: Fri Oct 14, 2005 10:56 pm

Optimizar consulta SQL

Postby jose.luis » Thu Dec 20, 2007 9:28 am

Pedro,
Al vuelo y sin poder probarlo,
Select a.codigo, a.descrip, a.envase, CASE WHEN f.pvp IS NULL THEN a.precio
ELSE f.pvp END, .....
FROM articulo a INNER JOIN tarifas f ON f.id_tarifa = 1 AND f.cod_art =
a.codigo
WHERE ....
Saludos,
José Luis Capel
"Pedro Amaro" <dospcserv@hotmail.com> escribió en el mensaje
news:476a2561$1@ozsrv2.ozlan.local...
> Hola Manu;
>
> No es tanto corregir, que funciona, sino optimizar. A mi parecer un
> desperdicio de recursos tener dos veces el SELECT interior
> "SELECT f.pvp FROM tarifas f WHERE f.id_tarifa = 1 AND f.cod_art =
> a.codigo"
>
> Mi cuestion es si hay alguna manera de asignar el resultado de ese SELECT
> en alguna "variable" temporal para usarlo tanto en el CASE WHEN como en el
> ELSE dentro de la consulta SQL.
>
> Algo así
>
> SubConsulta := SELECT f.pvp FROM tarifas f WHERE f.id_tarifa = 1 AND
> f.cod_art = a.codigo
> SELECT a.codigo, a.descrip, a.envase,
> CASE WHEN SubConsulta IS NULL
> THEN a.precio
> ELSE SubConsulta
> END AS pof FROM articulo a ORDER BY a.descrip
>
> Pero claro dentro de la instrucción SQL.
>
> Un saludo
> Pedro Amaro
>
> Nota: Ahora que veo lo que he escrito me da que no queda muy claro que lo
> que quiero guardar en SubConsulta es el resultado del SELECT no la cadena
> de busqueda.
>
>
Pedro Amaro
Posts: 157
Joined: Thu May 18, 2006 5:10 pm

Optimizar consulta SQL

Postby Pedro Amaro » Thu Dec 20, 2007 9:39 am

Gracias por responder Jose Luis;
pero no funciona ya que en la tabla "tarifa" no estan todos los "a.codigo"
ya que en ella solo se graban los "a.codigo" que tengan precio diferente en
alguna "f.id_tarifa", con tu solución solo me presenta los "a.codigo" que
estan en la tabla "tarifa" y cumplan con la condición, pero el resto de
"a.codigo" no aparecen.
Un saludo
Pedro Amaro
"José Luis Capel - Aicom" <jose.luis@iaicom.com> escribió en el mensaje
news:476a271f$1@ozsrv2.ozlan.local...
> Pedro,
>
> Al vuelo y sin poder probarlo,
>
> Select a.codigo, a.descrip, a.envase, CASE WHEN f.pvp IS NULL THEN
> a.precio ELSE f.pvp END, .....
>
> FROM articulo a INNER JOIN tarifas f ON f.id_tarifa = 1 AND f.cod_art =
> a.codigo
>
> WHERE ....
>
> Saludos,
> José Luis Capel
jose.luis
Posts: 1633
Joined: Fri Oct 14, 2005 10:56 pm

Optimizar consulta SQL

Postby jose.luis » Thu Dec 20, 2007 10:33 am

Pedro,
Entonces en vez de un inner join haz un left outer join.
Saludos,
José Luis Capel
"Pedro Amaro" <dospcserv@hotmail.com> escribió en el mensaje
news:476a2a33$1@ozsrv2.ozlan.local...
> Gracias por responder Jose Luis;
> pero no funciona ya que en la tabla "tarifa" no estan todos los "a.codigo"
> ya que en ella solo se graban los "a.codigo" que tengan precio diferente
> en alguna "f.id_tarifa", con tu solución solo me presenta los "a.codigo"
> que estan en la tabla "tarifa" y cumplan con la condición, pero el resto
> de "a.codigo" no aparecen.
>
> Un saludo
> Pedro Amaro
>
> "José Luis Capel - Aicom" <jose.luis@iaicom.com> escribió en el mensaje
> news:476a271f$1@ozsrv2.ozlan.local...
>> Pedro,
>>
>> Al vuelo y sin poder probarlo,
>>
>> Select a.codigo, a.descrip, a.envase, CASE WHEN f.pvp IS NULL THEN
>> a.precio ELSE f.pvp END, .....
>>
>> FROM articulo a INNER JOIN tarifas f ON f.id_tarifa = 1 AND f.cod_art =
>> a.codigo
>>
>> WHERE ....
>>
>> Saludos,
>> José Luis Capel
>
>
>
Pedro Amaro
Posts: 157
Joined: Thu May 18, 2006 5:10 pm

Optimizar consulta SQL

Postby Pedro Amaro » Thu Dec 20, 2007 6:49 pm

Ere u'Fenomeno Mestro!!
Eso era exactamente lo que hacia falta, me parecia a mi muy enrebesada mi
solucion, tenia que haber otra mas simple.
Un saludo
Pedro Amaro

Return to “SQL”