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:51:57 |
Message-ID: | f32f65ea0610180851w56685217u5289350e17bd9317@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Listeros!, consegui una posible solución, espero que les pueda ayudar y si
tienen algo en contra aporten sus comentarios.
SELECT * FROM (
SELECT DISTINCT u."pk_usuario", u."nombre", u."apellido",
fn_xrxx_estudiante_iap(u."pk_usuario", 109) AS IAP
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
) AS tbl_sq
WHERE IAP >= 16;
On 10/18/06, Nicola Strappazzon <nicola51980(at)gmail(dot)com> wrote:
>
> 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
--
Nicola Strappazzon C.
---------------------------------
Cel.: 0416-632.67.28
From | Date | Subject | |
---|---|---|---|
Next Message | Ricardo Navarro L | 2006-10-18 15:52:19 | RE: Ayuda extensiónes |
Previous Message | Carlos Alberto Márquez Rey | 2006-10-18 15:27:34 | Re: Error de Instalacion |