Como se puede hacer este Select

22/06/2006 - 07:01 por Carlos Gómez | Informe spam
De que forma se puede realizar esta consulta (que obviamente esta mal)

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE LaFuncion > 3 --Esto es lo que obviamente esta mal
ORDER BY LaFuncion

Lo que quiero evitar es evaluar 2 veces la dbo.Funcion -la cual devuelve un
numero- ya que es algo pesada teniendo en cuenta el numero de registros, es
decir: lo siguiente es lo que quiero evitar, pero en definitiva es este el
resultado que deseo:

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE dbo.Funcion(Nombre,'Parametro') > 3
ORDER BY LaFuncion

Ah, si es posible realizarla sin crear una tabla temporal y demas...
Desde Aguadulce - España
Carlos Gomez

Preguntas similare

Leer las respuestas

#6 qwalgrande
22/06/2006 - 23:02 | Informe spam
Hola.

Si estás trabajando con SQL Server 2005, tu caso es el típico ejemplo que se
resuelve con una llamada a tu función definida por el usuario unida a otra
tabla mediante CROSS APPLY. Para ello tu función debe devolver una tabla
(ojo, en tu caso la función devolvía un número, no una tabla, tendrías que
adaptarla y a lo mejor eso no es posible). Luego, uno de los parámetros de
la función es un campo de la tabla a la que se une.

Sería algo así como:

SELECT
t.Nombre, f.LaFuncion
FROM
Personas as t
CROSS APPLY
dbo.Funcion(t.Nombre, 'Parametro') as f
where f.LaFuncion > 3
order by f.LaFuncion

Otra cosa es el rendimiento que esto tenga, como siempre algo complicado de
determinar feacientemente con las funciones.

Alberto López Grande (qwalgrande)


"Carlos Gómez" escribió en el mensaje
news:
De que forma se puede realizar esta consulta (que obviamente esta mal)

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE LaFuncion > 3 --Esto es lo que obviamente esta mal
ORDER BY LaFuncion

Lo que quiero evitar es evaluar 2 veces la dbo.Funcion -la cual devuelve
un
numero- ya que es algo pesada teniendo en cuenta el numero de registros,
es
decir: lo siguiente es lo que quiero evitar, pero en definitiva es este el
resultado que deseo:

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE dbo.Funcion(Nombre,'Parametro') > 3
ORDER BY LaFuncion

Ah, si es posible realizarla sin crear una tabla temporal y demas...
Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
#7 Norman A. Armas
23/06/2006 - 16:18 | Informe spam
En caso de que tu funcion sea un select y no un calculo solamente lo mas
optimoi usar un subquery y olvidarte de la funcion, ahora la otra pregunta
de como no escribir 2 veces la evaluacion lo resuelves de esta forma.

select * from
(
SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
) as t
where t.LaFuncion > 3
order by
t.LaFuncion


Saludos


Norman



"Carlos Gómez" wrote in message
news:
De que forma se puede realizar esta consulta (que obviamente esta mal)

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE LaFuncion > 3 --Esto es lo que obviamente esta mal
ORDER BY LaFuncion

Lo que quiero evitar es evaluar 2 veces la dbo.Funcion -la cual devuelve
un
numero- ya que es algo pesada teniendo en cuenta el numero de registros,
es
decir: lo siguiente es lo que quiero evitar, pero en definitiva es este el
resultado que deseo:

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE dbo.Funcion(Nombre,'Parametro') > 3
ORDER BY LaFuncion

Ah, si es posible realizarla sin crear una tabla temporal y demas...
Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
#8 marco
26/06/2006 - 18:04 | Informe spam
Hola, yo usaria el resultado del select en una tabla en memoria, tal como:

DECLARE @tabla TABLE (Nombre nvarchar(50), LaFuncion int)

INSERT INTO @tabla (Nombre, LaFuncion)
SELECT Nombre, dbo.Funcion(Nombre,'Parametro')
FROM Personas

SELECT Nombre, LaFuncion
FROM @tabla
WHERE LaFuncion > 3
ORDER BY LaFuncion


Tal vez no sea muy elegante pero es muy probable que mejore el desempeño.

Saludos

Marco Padierna


"Carlos Gómez" escribió en el mensaje
news:
De que forma se puede realizar esta consulta (que obviamente esta mal)

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE LaFuncion > 3 --Esto es lo que obviamente esta mal
ORDER BY LaFuncion

Lo que quiero evitar es evaluar 2 veces la dbo.Funcion -la cual devuelve
un
numero- ya que es algo pesada teniendo en cuenta el numero de registros,
es
decir: lo siguiente es lo que quiero evitar, pero en definitiva es este el
resultado que deseo:

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE dbo.Funcion(Nombre,'Parametro') > 3
ORDER BY LaFuncion

Ah, si es posible realizarla sin crear una tabla temporal y demas...
Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
#9 Carlos Gómez
26/06/2006 - 18:10 | Informe spam
Muchas gracias a todos por las respuestas y observaciones
Desde Aguadulce - España
Carlos Gomez
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida