Re: Dudas en un query con funcion y con el where.

From: "Nicola Strappazzon" <nicola51980(at)gmail(dot)com>
To: "Nicola Strappazzon" <nicola51980(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Dudas en un query con funcion y con el where.
Date: 2006-10-18 15:14:14
Message-ID: f32f65ea0610180814p66bf1a87w4935f5e0b61d54d1@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Coye voy a probar, pero te mando lo que contiene la función, por q de verdad
creo q esta dificil ponerla en un subquery, Gracias por la ayuda!.

-- DROP FUNCTION fn_xrxx_estudiante_iap(int8, int4);

CREATE OR REPLACE FUNCTION fn_xrxx_estudiante_iap(int8, int4)
RETURNS float4 AS
$BODY$
DECLARE
iEscuela INT2;
iReturn FLOAT4;
fV1 FLOAT4;
fV2 FLOAT4;
BEGIN

IF (SELECT COUNT(*)
FROM tbl_Usuarios
WHERE PK_Usuario = $1) = 0 THEN
RETURN -1;
END IF;

iEscuela := (SELECT pk_atributo FROM fn_xrxx_estudiante_escuela($1) AS
(pk_atributo int8, codigo int2, escuela VARCHAR(45), fk_estructura int2,
nombre VARCHAR(45)));

fV1 := (SELECT SUM(A.UnidadCredito * RA.Calificacion )
FROM tbl_recordsacademicos RA
INNER JOIN tbl_Asignaturas A ON RA.FK_Asignatura =
A.PK_Asignatura
INNER JOIN tbl_inscripciones i ON i.pk_inscripcion =
ra.fk_inscripcion
INNER JOIN tbl_usuariosgrupos ug ON ug.pk_usuariogrupo =
i.fk_usuariogrupo
INNER JOIN tbl_pensums p ON p.pk_pensum = A.fk_pensum
WHERE ug.FK_Usuario = $1 AND
ra.FK_atributo = 862 AND
p.FK_Escuela = iEscuela AND
i.fk_periodo = $2);

fV2 := (SELECT SUM(A.UnidadCredito)
FROM tbl_recordsacademicos RA
INNER JOIN tbl_Asignaturas A ON
RA.FK_Asignatura = A.PK_Asignatura
INNER JOIN tbl_inscripciones i ON
i.pk_inscripcion = ra.fk_inscripcion
INNER JOIN tbl_usuariosgrupos ug ON
ug.pk_usuariogrupo = i.fk_usuariogrupo
INNER JOIN tbl_pensums p ON p.pk_pensum = A.fk_pensum
WHERE ug.FK_Usuario = $1 AND
ra.FK_atributo = 862 AND
p.FK_Escuela = iEscuela AND
i.fk_periodo = $2);

iReturn := fV1 / fV2;

RETURN iReturn;
END;

$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION fn_xrxx_estudiante_iap(int8, int4) OWNER TO postgres;
COMMENT ON FUNCTION fn_xrxx_estudiante_iap(int8, int4) IS 'Calcula el Indice
Academico de un Periodo (IAP) en especifico y de un estudiante
determinado.';

On 10/18/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
>
> Nicola Strappazzon escribió:
> > Hola lista, se me presento un problema con el tiempo que se tarda para
> > retornas datos de una consulta, dicha consulta llama a una función para
> > calcular el indice academico de un estudiante, y luego llamo nuevamente
> ha
> > esta funcion para filtrar los datos que sean mayor o igual a 16.
> >
> > SELECT DISTINCT u."pk_usuario", u."nombre", u."apellido",
> > fn_xrxx_estudiante_iap(u."pk_usuario", 109)
> > FROM tbl_recordsacademicos ra
> > INNER JOIN tbl_inscripciones i ON i.pk_inscripcion = ra.fk_inscripcion
> > INNER JOIN tbl_asignaturas ag ON ag.pk_asignatura = ra.fk_asignatura
> > INNER JOIN tbl_usuariosgrupos ug ON ug.pk_usuariogrupo =
> i."fk_usuariogrupo"
> > INNER JOIN tbl_usuarios u ON u.pk_usuario = ug.fk_usuario
> > WHERE i.fk_periodo = 109
> > AND i.fk_atributo = 11
> > AND fn_xrxx_estudiante_iap(u."pk_usuario", 109) >= 16;
> >
> > Mi pregunta es la siguiente, como hago para no llamar dos veces a la
> función
> > y me filte los datos, existe esa posibilidad? hay otra forma?
>
> Puedes meter la funcion en un subselect en el FROM. No tengo tiempo en
> este momento de mostrarte como se hace, algun otro listero te puede
> ayudar (si es que no puedes hacerlo tu mismo -- en realidad no es tan
> dificil)
>
> Una vez que lo hayas hecho, examina el plan de ejecucion con EXPLAIN,
> porque puede que el optimizer reduzca esa consulta a esta misma forma.
> En ese caso deberas poner un OFFSET 0 a la consulta del subselect, lo
> cual actua como una barrera de optimizacion ("optimization barrier";
> puedes mirar los archivos de pgsql-hackers para leer mas sobre ese
> truco).
>
> --
> Alvaro Herrera
> http://www.CommandPrompt.com/
> PostgreSQL Replication, Consulting, Custom Development, 24x7 support
>

--

Nicola Strappazzon C.
---------------------------------
Cel.: 0416-632.67.28

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Pedro Mateo 2006-10-18 15:17:05 Re: RE: Ayuda extensiónes
Previous Message Alvaro Herrera 2006-10-18 15:12:16 Re: pregunta sobre psql