Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

Next:From: Ricardo Navarro LDate: 2006-10-18 15:52:19
Subject: RE: Ayuda extensiónes
Previous:From: Carlos Alberto Márquez ReyDate: 2006-10-18 15:27:34
Subject: Re: Error de Instalacion

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group