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: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

In response to

Browse pgsql-es-ayuda by date

  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