como optimizar esto???

15/11/2003 - 15:47 por Tolo | Informe spam
Hola

estoy haciendo una función qeu me devuelve el precio de un articulo a través
de la variable @pv, para ello necisto hacer el cálculo como:

if not exists (select @pv = preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@tercer)
select @pv = preu_venta from t_articles where id_article = @article

Pero no puedo en el mismo select q miro si existe asignar el valor a mi
variable, y tengo q hacer ...

if exists (select preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@tercer)
select @pv = preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@terce
else
select @pv = preu_venta from t_articles where id_article = @article


hay forma de mejorar esto???

gracias de nuevo

Preguntas similare

Leer las respuestas

#1 Javier Loria
15/11/2003 - 16:57 | Informe spam
Hola Tolo:
Sin el esquema de las tablas es mucho mas dificil.
Si pretendes crear una funcion escalar con esto, vas a matar el
desempeno de SQL.
Prueba con esto:
/* Codigo SIN PROBAR y SIN ESQUEMA :( */
SELECT COALESCE(preu_especial,preu_venta)
FROM T_Articles
LEFT JOIN T_PreusEspecials
ON T_Articles.id_article=T_PreusEspecials.fk_article
T_PreusEspecials.fk_tercer=@tercer
WHERE T_Articles.id_article=@article
/* Fin de Codigo SIN PROBAR Y SIN ESQUEMA */

Si creas una funcion en Linea (eliminando el filtro del Article) y
agregando algunas columnas podrias usarlo como una vista parametrizada con
buen desemepeno.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Tolo escribio:
Hola

estoy haciendo una función qeu me devuelve el precio de un articulo a
través de la variable @pv, para ello necisto hacer el cálculo como:

if not exists (select @pv = preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@tercer)
select @pv = preu_venta from t_articles where id_article > @article

Pero no puedo en el mismo select q miro si existe asignar el valor a
mi variable, y tengo q hacer ...

if exists (select preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@tercer)
select @pv = preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@terce
else
select @pv = preu_venta from t_articles where id_article > @article


hay forma de mejorar esto???

gracias de nuevo
Respuesta Responder a este mensaje
#2 Tolo
15/11/2003 - 17:32 | Informe spam
Hola Javier,

Ante todo muchas Gracias

A ver si me explico bién, intentaré contarte todo el problema. Tengo una
tabla de Artículos con un precio de venta, y luego una tabla de
preciosxCliente en la cual guardo el id_cliente, id_articulo y precio. Pues
bién, quiero una función que me dé el precio de un artículo por cliente, q
en pseudocódigo sería como:

Si Existe Precio Cliente entonces @Precio=Precio_Cliente
sino @Precio=Precio_Artículo

entonces esto traducido queda como:

if not exists (select @pv = precio_Cliente from t_PreciosEspeciales
where fk_articulo=@articulo and fk_cliente=@cliente)
select @pv = preu_articulo from t_articulos where id_articulo @articulo

el problema está en que no puedo asignar el valor Precio_Cliente a @pv pues
me da error, y claro, entonces debo hacer esto:

if exists (select precio_Cliente from t_PreciosEspeciales where
fk_articulo=@articulo and fk_cliente=@cliente)
select @pv = precio_Cliente from t_PreciosEspeciales where
fk_articulo=@articulo and fk_cliente=@cliente
else
select @pv = preu_articulo from t_articulos where id_articulo @articulo

Con lo cual hago dos veces el mismo select, lo cual no me termina de
convencer... :(

gracias



"Javier Loria" escribió en el mensaje
news:
Hola Tolo:
Sin el esquema de las tablas es mucho mas dificil.
Si pretendes crear una funcion escalar con esto, vas a matar el
desempeno de SQL.
Prueba con esto:
/* Codigo SIN PROBAR y SIN ESQUEMA :( */
SELECT COALESCE(preu_especial,preu_venta)
FROM T_Articles
LEFT JOIN T_PreusEspecials
ON T_Articles.id_article=T_PreusEspecials.fk_article
T_PreusEspecials.fk_tercer=@tercer
WHERE T_Articles.id_article=@article
/* Fin de Codigo SIN PROBAR Y SIN ESQUEMA */

Si creas una funcion en Linea (eliminando el filtro del Article) y
agregando algunas columnas podrias usarlo como una vista parametrizada con
buen desemepeno.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Tolo escribio:
> Hola
>
> estoy haciendo una función qeu me devuelve el precio de un articulo a
> través de la variable @pv, para ello necisto hacer el cálculo como:
>
> if not exists (select @pv = preu_especial from t_PreusEspecials where
> fk_article=@article and fk_tercer=@tercer)
> select @pv = preu_venta from t_articles where id_article > > @article
>
> Pero no puedo en el mismo select q miro si existe asignar el valor a
> mi variable, y tengo q hacer ...
>
> if exists (select preu_especial from t_PreusEspecials where
> fk_article=@article and fk_tercer=@tercer)
> select @pv = preu_especial from t_PreusEspecials where
> fk_article=@article and fk_tercer=@terce
> else
> select @pv = preu_venta from t_articles where id_article > > @article
>
>
> hay forma de mejorar esto???
>
> gracias de nuevo


Respuesta Responder a este mensaje
#3 Javier Loria
15/11/2003 - 18:58 | Informe spam
Hola Tolo:
Con gusto y antes de continuar queria felicitarte por el diseno de las
Tablas, para ser un Foxero con pocos meses de haber empezado en SQL agarras
rapido la cosa (lo digo porque revise tus posteos previos).
Si traduzco tu Pseudocodigo Procedimental de:
-
Si Existe Precio Cliente entonces
@Precio=Precio_Cliente sino @Precio=Precio_Artículo
Ha "Pseucodigo de Conjuntos"
Precio= Si existe PrecioCliente PrecioCliente SINO PrecioArticulo.
Tendras tu sentencia:
==SELECT COALESCE(preu_especial, preu_venta)
FROM T_Articles
LEFT JOIN T_PreusEspecials
ON T_Articles.id_article=T_PreusEspecials.fk_article
T_PreusEspecials.fk_tercer=@tercer
==El COALESCE es como un ISNULL, lo que hace es devolverte el primer valor NO
Nulo, en tu caso si existe preu_especial te da este valor, sino te de
preu_venta. La ventaja de COALESCE es que es ANSI y que permite mas de un
valor.
El LEFT JOIN te permite unir todos los Articulos con los Articulos que
existan en PreusEspecials, si un articulo NO existe en PreusEspecials en
LEFT JOIN siempre lo desplegara, y las columnas de PreusEspecials tendran
valor Nulo.
Si le agregas algunas columnas de articulos (Codigo de Articulo, Nombre,
etc.) te puedes construir una funcion en Linea que te permita hacer:
-
SELECT *
FROM dbo.MisPrecios('MiCliente')
-
Los IF's no son malos en SQL, pero si tienes demasiados es normalmente mal
sintoma.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Tolo escribio:
Hola Javier,

Ante todo muchas Gracias

A ver si me explico bién, intentaré contarte todo el problema. Tengo
una tabla de Artículos con un precio de venta, y luego una tabla de
preciosxCliente en la cual guardo el id_cliente, id_articulo y
precio. Pues bién, quiero una función que me dé el precio de un
artículo por cliente, q en pseudocódigo sería como:

Si Existe Precio Cliente entonces @Precio=Precio_Cliente
sino @Precio=Precio_Artículo

entonces esto traducido queda como:

if not exists (select @pv = precio_Cliente from
t_PreciosEspeciales where fk_articulo=@articulo and
fk_cliente=@cliente) select @pv = preu_articulo from
t_articulos where id_articulo = @articulo

el problema está en que no puedo asignar el valor Precio_Cliente a
@pv pues me da error, y claro, entonces debo hacer esto:

if exists (select precio_Cliente from t_PreciosEspeciales where
fk_articulo=@articulo and fk_cliente=@cliente)
select @pv = precio_Cliente from t_PreciosEspeciales where
fk_articulo=@articulo and fk_cliente=@cliente
else
select @pv = preu_articulo from t_articulos where id_articulo > @articulo

Con lo cual hago dos veces el mismo select, lo cual no me termina de
convencer... :(

gracias



"Javier Loria" escribió en el mensaje
news:
Hola Tolo:
Sin el esquema de las tablas es mucho mas dificil.
Si pretendes crear una funcion escalar con esto, vas a matar el
desempeno de SQL.
Prueba con esto:
/* Codigo SIN PROBAR y SIN ESQUEMA :( */
SELECT COALESCE(preu_especial,preu_venta)
FROM T_Articles
LEFT JOIN T_PreusEspecials
ON T_Articles.id_article=T_PreusEspecials.fk_article
T_PreusEspecials.fk_tercer=@tercer
WHERE T_Articles.id_article=@article
/* Fin de Codigo SIN PROBAR Y SIN ESQUEMA */

Si creas una funcion en Linea (eliminando el filtro del Article)
y agregando algunas columnas podrias usarlo como una vista
parametrizada con buen desemepeno.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Tolo escribio:
Hola

estoy haciendo una función qeu me devuelve el precio de un articulo
a través de la variable @pv, para ello necisto hacer el cálculo
como:

if not exists (select @pv = preu_especial from t_PreusEspecials
where fk_article=@article and fk_tercer=@tercer)
select @pv = preu_venta from t_articles where id_article >>> @article

Pero no puedo en el mismo select q miro si existe asignar el valor a
mi variable, y tengo q hacer ...

if exists (select preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@tercer)
select @pv = preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@terce
else
select @pv = preu_venta from t_articles where id_article >>> @article


hay forma de mejorar esto???

gracias de nuevo
Respuesta Responder a este mensaje
#4 Tolo
15/11/2003 - 19:22 | Informe spam
gracias Javier, siento rectificarte pero empezé con el sql server el pasado
lunes a ratos perdidos, y bién por el momento creo q las cosas no me van del
todo mal (creo tener ya media gestión comercial hecha :) ). Referente al
fox, la verdad hay mucha gente q lo critica y tal, pero para programar
aplicaciones de gestión es mucho mejor que el Vb (por ejemplo), pero bueno,
no me pondré a discutir eso. Aunqeu lo uqe realmente hace buena una
aplicación es el diseño de la BD, una BD bien diseñada hace que la
aplicación sea muy facil de crear, no?

muy buena tu solución, jeje, ves en fox no existe esa función. Muchas
gracias, veo q tu tampoco eres manco con esto del sql

gracias


"Javier Loria" escribió en el mensaje
news:#
Hola Tolo:
Con gusto y antes de continuar queria felicitarte por el diseno de las
Tablas, para ser un Foxero con pocos meses de haber empezado en SQL


agarras
rapido la cosa (lo digo porque revise tus posteos previos).
Si traduzco tu Pseudocodigo Procedimental de:
-
Si Existe Precio Cliente entonces
@Precio=Precio_Cliente sino @Precio=Precio_Artículo
Ha "Pseucodigo de Conjuntos"
Precio= Si existe PrecioCliente PrecioCliente SINO PrecioArticulo.
Tendras tu sentencia:
==> SELECT COALESCE(preu_especial, preu_venta)
FROM T_Articles
LEFT JOIN T_PreusEspecials
ON T_Articles.id_article=T_PreusEspecials.fk_article
T_PreusEspecials.fk_tercer=@tercer
==> El COALESCE es como un ISNULL, lo que hace es devolverte el primer valor


NO
Nulo, en tu caso si existe preu_especial te da este valor, sino te de
preu_venta. La ventaja de COALESCE es que es ANSI y que permite mas de un
valor.
El LEFT JOIN te permite unir todos los Articulos con los Articulos que
existan en PreusEspecials, si un articulo NO existe en PreusEspecials en
LEFT JOIN siempre lo desplegara, y las columnas de PreusEspecials tendran
valor Nulo.
Si le agregas algunas columnas de articulos (Codigo de Articulo, Nombre,
etc.) te puedes construir una funcion en Linea que te permita hacer:
-
SELECT *
FROM dbo.MisPrecios('MiCliente')
-
Los IF's no son malos en SQL, pero si tienes demasiados es normalmente mal
sintoma.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Tolo escribio:
> Hola Javier,
>
> Ante todo muchas Gracias
>
> A ver si me explico bién, intentaré contarte todo el problema. Tengo
> una tabla de Artículos con un precio de venta, y luego una tabla de
> preciosxCliente en la cual guardo el id_cliente, id_articulo y
> precio. Pues bién, quiero una función que me dé el precio de un
> artículo por cliente, q en pseudocódigo sería como:
>
> Si Existe Precio Cliente entonces @Precio=Precio_Cliente
> sino @Precio=Precio_Artículo
>
> entonces esto traducido queda como:
>
> if not exists (select @pv = precio_Cliente from
> t_PreciosEspeciales where fk_articulo=@articulo and
> fk_cliente=@cliente) select @pv = preu_articulo from
> t_articulos where id_articulo = @articulo
>
> el problema está en que no puedo asignar el valor Precio_Cliente a
> @pv pues me da error, y claro, entonces debo hacer esto:
>
> if exists (select precio_Cliente from t_PreciosEspeciales where
> fk_articulo=@articulo and fk_cliente=@cliente)
> select @pv = precio_Cliente from t_PreciosEspeciales where
> fk_articulo=@articulo and fk_cliente=@cliente
> else
> select @pv = preu_articulo from t_articulos where id_articulo > > @articulo
>
> Con lo cual hago dos veces el mismo select, lo cual no me termina de
> convencer... :(
>
> gracias
>
>
>
> "Javier Loria" escribió en el mensaje
> news:
>> Hola Tolo:
>> Sin el esquema de las tablas es mucho mas dificil.
>> Si pretendes crear una funcion escalar con esto, vas a matar el
>> desempeno de SQL.
>> Prueba con esto:
>> /* Codigo SIN PROBAR y SIN ESQUEMA :( */
>> SELECT COALESCE(preu_especial,preu_venta)
>> FROM T_Articles
>> LEFT JOIN T_PreusEspecials
>> ON T_Articles.id_article=T_PreusEspecials.fk_article
>> T_PreusEspecials.fk_tercer=@tercer
>> WHERE T_Articles.id_article=@article
>> /* Fin de Codigo SIN PROBAR Y SIN ESQUEMA */
>>
>> Si creas una funcion en Linea (eliminando el filtro del Article)
>> y agregando algunas columnas podrias usarlo como una vista
>> parametrizada con buen desemepeno.
>> Saludos,
>>
>>
>> Javier Loria
>> Costa Rica
>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>> que pueda ser copiado y pegado al Query Analizer.
>> La version de SQL y Service Pack tambien ayuda.
>> Tolo escribio:
>>> Hola
>>>
>>> estoy haciendo una función qeu me devuelve el precio de un articulo
>>> a través de la variable @pv, para ello necisto hacer el cálculo
>>> como:
>>>
>>> if not exists (select @pv = preu_especial from t_PreusEspecials
>>> where fk_article=@article and fk_tercer=@tercer)
>>> select @pv = preu_venta from t_articles where id_article > >>> @article
>>>
>>> Pero no puedo en el mismo select q miro si existe asignar el valor a
>>> mi variable, y tengo q hacer ...
>>>
>>> if exists (select preu_especial from t_PreusEspecials where
>>> fk_article=@article and fk_tercer=@tercer)
>>> select @pv = preu_especial from t_PreusEspecials where
>>> fk_article=@article and fk_tercer=@terce
>>> else
>>> select @pv = preu_venta from t_articles where id_article > >>> @article
>>>
>>>
>>> hay forma de mejorar esto???
>>>
>>> gracias de nuevo


Respuesta Responder a este mensaje
#5 Tolo
15/11/2003 - 19:28 | Informe spam
Lo dicho, la base está en ser capaz de simplificar los problemas, a veces
los problemas más grandes tienen una solución muy sencilla, y a lo mejor lo
q algunos resolverían usando varias tablas, se puede hacer con una sola. Por
ejemplo el tema de los documentos en una gestión comercial:

Basta con tener una tabla de cabeceras y una de líneas para todos los tipos
(compras o ventas, albaranes, facturas, pedidos, ...), si se recurre a hacer
una tabla de cabeceras y otra de lineas para cada tipo de documento el
programa se hace un monstruo y luego para sacar un simple listado de
movimientos te sale un pedazo consulta de la leche..

venga, hasta luego...

" Tolo" escribió en el mensaje
news:
gracias Javier, siento rectificarte pero empezé con el sql server el


pasado
lunes a ratos perdidos, y bién por el momento creo q las cosas no me van


del
todo mal (creo tener ya media gestión comercial hecha :) ). Referente al
fox, la verdad hay mucha gente q lo critica y tal, pero para programar
aplicaciones de gestión es mucho mejor que el Vb (por ejemplo), pero


bueno,
no me pondré a discutir eso. Aunqeu lo uqe realmente hace buena una
aplicación es el diseño de la BD, una BD bien diseñada hace que la
aplicación sea muy facil de crear, no?

muy buena tu solución, jeje, ves en fox no existe esa función. Muchas
gracias, veo q tu tampoco eres manco con esto del sql

gracias


"Javier Loria" escribió en el mensaje
news:#
> Hola Tolo:
> Con gusto y antes de continuar queria felicitarte por el diseno de


las
> Tablas, para ser un Foxero con pocos meses de haber empezado en SQL
agarras
> rapido la cosa (lo digo porque revise tus posteos previos).
> Si traduzco tu Pseudocodigo Procedimental de:
> -
> Si Existe Precio Cliente entonces
> @Precio=Precio_Cliente sino @Precio=Precio_Artículo
> Ha "Pseucodigo de Conjuntos"
> Precio= Si existe PrecioCliente PrecioCliente SINO PrecioArticulo.
> Tendras tu sentencia:
> ==> > SELECT COALESCE(preu_especial, preu_venta)
> FROM T_Articles
> LEFT JOIN T_PreusEspecials
> ON T_Articles.id_article=T_PreusEspecials.fk_article
> T_PreusEspecials.fk_tercer=@tercer
> ==> > El COALESCE es como un ISNULL, lo que hace es devolverte el primer valor
NO
> Nulo, en tu caso si existe preu_especial te da este valor, sino te de
> preu_venta. La ventaja de COALESCE es que es ANSI y que permite mas de


un
> valor.
> El LEFT JOIN te permite unir todos los Articulos con los Articulos que
> existan en PreusEspecials, si un articulo NO existe en PreusEspecials en
> LEFT JOIN siempre lo desplegara, y las columnas de PreusEspecials


tendran
> valor Nulo.
> Si le agregas algunas columnas de articulos (Codigo de Articulo, Nombre,
> etc.) te puedes construir una funcion en Linea que te permita hacer:
> -
> SELECT *
> FROM dbo.MisPrecios('MiCliente')
> -
> Los IF's no son malos en SQL, pero si tienes demasiados es normalmente


mal
> sintoma.
> Saludos,
>
>
> Javier Loria
> Costa Rica
> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> que pueda ser copiado y pegado al Query Analizer.
> La version de SQL y Service Pack tambien ayuda.
>
> Tolo escribio:
> > Hola Javier,
> >
> > Ante todo muchas Gracias
> >
> > A ver si me explico bién, intentaré contarte todo el problema. Tengo
> > una tabla de Artículos con un precio de venta, y luego una tabla de
> > preciosxCliente en la cual guardo el id_cliente, id_articulo y
> > precio. Pues bién, quiero una función que me dé el precio de un
> > artículo por cliente, q en pseudocódigo sería como:
> >
> > Si Existe Precio Cliente entonces @Precio=Precio_Cliente
> > sino @Precio=Precio_Artículo
> >
> > entonces esto traducido queda como:
> >
> > if not exists (select @pv = precio_Cliente from
> > t_PreciosEspeciales where fk_articulo=@articulo and
> > fk_cliente=@cliente) select @pv = preu_articulo from
> > t_articulos where id_articulo = @articulo
> >
> > el problema está en que no puedo asignar el valor Precio_Cliente a
> > @pv pues me da error, y claro, entonces debo hacer esto:
> >
> > if exists (select precio_Cliente from t_PreciosEspeciales where
> > fk_articulo=@articulo and fk_cliente=@cliente)
> > select @pv = precio_Cliente from t_PreciosEspeciales where
> > fk_articulo=@articulo and fk_cliente=@cliente
> > else
> > select @pv = preu_articulo from t_articulos where id_articulo > > > @articulo
> >
> > Con lo cual hago dos veces el mismo select, lo cual no me termina de
> > convencer... :(
> >
> > gracias
> >
> >
> >
> > "Javier Loria" escribió en el mensaje
> > news:
> >> Hola Tolo:
> >> Sin el esquema de las tablas es mucho mas dificil.
> >> Si pretendes crear una funcion escalar con esto, vas a matar el
> >> desempeno de SQL.
> >> Prueba con esto:
> >> /* Codigo SIN PROBAR y SIN ESQUEMA :( */
> >> SELECT COALESCE(preu_especial,preu_venta)
> >> FROM T_Articles
> >> LEFT JOIN T_PreusEspecials
> >> ON T_Articles.id_article=T_PreusEspecials.fk_article
> >> T_PreusEspecials.fk_tercer=@tercer
> >> WHERE T_Articles.id_article=@article
> >> /* Fin de Codigo SIN PROBAR Y SIN ESQUEMA */
> >>
> >> Si creas una funcion en Linea (eliminando el filtro del Article)
> >> y agregando algunas columnas podrias usarlo como una vista
> >> parametrizada con buen desemepeno.
> >> Saludos,
> >>
> >>
> >> Javier Loria
> >> Costa Rica
> >> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> >> que pueda ser copiado y pegado al Query Analizer.
> >> La version de SQL y Service Pack tambien ayuda.
> >> Tolo escribio:
> >>> Hola
> >>>
> >>> estoy haciendo una función qeu me devuelve el precio de un articulo
> >>> a través de la variable @pv, para ello necisto hacer el cálculo
> >>> como:
> >>>
> >>> if not exists (select @pv = preu_especial from t_PreusEspecials
> >>> where fk_article=@article and fk_tercer=@tercer)
> >>> select @pv = preu_venta from t_articles where id_article > > >>> @article
> >>>
> >>> Pero no puedo en el mismo select q miro si existe asignar el valor a
> >>> mi variable, y tengo q hacer ...
> >>>
> >>> if exists (select preu_especial from t_PreusEspecials where
> >>> fk_article=@article and fk_tercer=@tercer)
> >>> select @pv = preu_especial from t_PreusEspecials where
> >>> fk_article=@article and fk_tercer=@terce
> >>> else
> >>> select @pv = preu_venta from t_articles where id_article > > >>> @article
> >>>
> >>>
> >>> hay forma de mejorar esto???
> >>>
> >>> gracias de nuevo
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida