Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   SQL con subconsultas (https://www.clubdelphi.com/foros/showthread.php?t=79471)

dosru3das 09-07-2012 18:05:37

SQL con subconsultas
 
Hola amigos tengo un terrible problema de tiempo de respuesta... Tengo un SQL donde en su Clausula WHERE tiene como condicion el resultado de otros SQL y tarda aprox 1 minuto en responder a veces mas lo cual es inaceptable. El SQL es el siguiente. Debe devolverme las materias de un alumno de un instituto que esten en condiciones de ser cursadas. Las condiciones son igual que las de cualquier inst, Debe tener las correlativas aprob, pero a su vez estas si no estan aprobadas por final debo controlar que no esten vencidas, pero tambien deben aparecer las materias que ya aprobo pero se le vencio la cursada ( la cursada se vence si no aprueba el final dentro de las 15 fechas publicadas o si rinde mal en 3 ocaciones el final.) Es muy rebuscado y la consulta que idee funciona bien pero extremadamente lenta.
Código SQL [-]
Select MA1.*,
            M.Materia

From MateriasPorAlumno MA1,
       Materias M

Where (MA1.RelacConcarr = :RCC) and
      (MA1.recursada = False) and                      (en estas primeras 3 lineas restrinjo la busqueda a las mats del alumno en particular con RCC)
      (M.Codigo = MA1.CodMateria) and
            
                                                                (Aca comienzan las condiciones a las Materia)
      ((MA1.CursadaAprobada = 'NC') or        (NC = No cursada)
       (MA1.CursadaAprobada = 'Desap.') or
       ((MA1.CursadaAprobada = 'Libre') and (FinalAprobado = 'Desap.')) or  (Libre = no la cursa solo rinde el final)

       ((MA1.CursadaAprobada = 'Aprob.') and (MA1.finalAprobado ='Desap.') and
                      ((15 <= (Select Count(FF.CodMateria)                (Si pasaron mas de 15 fechas de finales despues que aprobo la cursada)
                               From  FechasdefinalesporCarrera FF
                               where (FF.Fecha > MA1.Fechafincursada) and
                                     (FF.CodCarrera = MA1.codCarrera) and
                                     (FF.CodMateria = MA1.CodMateria))) or
                       ((MA1.Seanoto1Final and  (MA1.Nota1Final <> 0)) and
                        (MA1.Seanoto2Final and  (MA1.Nota2Final <> 0) ) and          (si desap las 3 posib de rendir el final)
                        (MA1.Seanoto3Final and  (MA1.Nota3Final <> 0) ))) )) and

                                                              (Aca controlo si la cant de materias correlativas de esa materia son las mismas que aprobo)
      ((Select Count(CR.CodMateriaCorrelativa)
        From  CorrelatividadesCursadas CR
        Where (CR.CodCarrera= MA1.CodCarrera) and
             (CR.CodMateria = MA1.CodMateria)) =
                                                (Select Count(MA2.CodMateria)
                                                 From  MateriasPoralumno MA2,
                                                       CorrelatividadesCursadas CR
                                                 Where (CR.CodCarrera=MA1.CodCarrera) and
                                                       (CR.CodMateria = MA1.CodMateria) and
                                                       (MA2.CodMateria=CR.CodMateriaCorrelativa) and
                                                       (MA2.Relacconcarr=MA1.Relacconcarr) and
                                                       (MA2.CursadaAprobada = 'Aprob.') and
                                                       ((MA2.FinalAprobado='Aprob.') or (((MA2.FinalAprobado='Desap.') or (FinalAprobado='NR'))and
                                                       (15 > (Select Count(FF.CodMateria)
                                                             From  FechasdefinalesporCarrera FF
                                                             where (FF.Fecha > MA2.Fechafincursada) and
                                                                   (FF.CodCarrera = MA2.codCarrera) and
                                                                   (FF.CodMateria = MA2.CodMateria))) and
                                                                   (Not MA2.Seanoto1Final or
                                                                    Not MA2.Seanoto2Final or
                                                                    Not MA2.Seanoto3Final)))))

Tal vez haya una manera mas facil de solucionar esto. Espero alguien me pueda ayudar... un saludo cordial a todos.

Casimiro Notevi 09-07-2012 18:17:30

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)


Creo que sería conveniente que dijeras qué base de datos estás usando, además de poner una descripción de tablas/campos y exactamente qué quieres obtener.
Saludos.


La franja horaria es GMT +2. Ahora son las 13:01:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi